<p>以下是我所做的:</p>
<ol>
<li>我直接在我的程序编辑器(Python3.8)中测试了ruohola的代码。它一开始不起作用,因为在<code>exec()</code>{<cd2>}中<code>builtins.__dict__</code>似乎已经是对<code>builtins.__dict__</code>的引用,所以在我将代码修改为<code>imp = __builtins__[f"__{''.join(map(chr,(105,109,112,111,114,116)))}__"]</code>之后,一切都按预期工作,当然它很容易绕过我的弱验证函数</李>
<li>我放弃了我的验证功能,并坚持按照ruohola的建议,不要费心去完成一个基于“字符串验证”的黑名单。除了ruohola的代码示例之外,我还发现了一些更有趣的方法,可以利用nneonneo关于如何对python进行沙箱的链接中<code>exec()</code>的使用</李>
<li><p>由于学生们只需要一小部分Python的<code>builtins</code>函数,在进行了更多的研究之后,我采用了白名单方法,将<code>__builtins__</code>设置为空字典,从而禁用了它在<code>exec()</code>中的使用。所以现在ruohola的代码不再工作了,因为它不可能使用<code>import</code>。问题是这种方法是否足够(参见第4条)</p>
<pre><code>restricted_env = {
'__builtins__': {},
'range': range,
'kara': spaceship
}
exec(userInput, restricted_env)
</code></pre></li>
<li><p>我考虑的另一个解决方案是使用pyinstaller打包文件,并在spec文件中排除<em>os</em>。然后我必须重写代码中使用<code>os.path</code>和<code>os.path.join</code>的部分(如果有意义的话)</p></li>
</ol>
<p>如果我理解正确-使用<code>exec()</code>的主要威胁是可能使用<em>os</em>模块,从而能够访问和删除(重要)文件(即与操作系统相关)。但是它不可能访问其他用户的文件,或者会吗</p>
<p>总而言之,我考虑了学校的情况</p>
<ol>
<li>给定一台安装了python的计算机——如果所有不需要的操作都可以在python shell中执行,那么在我的自定义编辑器中安全使用<code>exec()</code>是否有意义</李>
<li>如果一台计算机没有安装python,我将不得不使用pyinstaller来构建一个可执行文件,以便在这样的计算机上运行它。因此,除非它能够从pyinstaller文件夹中的文件中“提取”操作系统模块,并以某种方式使其可访问,假设我上面提到的白名单解决方案足够了,否则我应该很乐意去做,不是吗</李>
</ol>