Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GAE中的Python中,限制执行不可信代码风险的最佳方法是什么?_Python_Google App Engine - Fatal编程技术网

在GAE中的Python中,限制执行不可信代码风险的最佳方法是什么?

在GAE中的Python中,限制执行不可信代码风险的最佳方法是什么?,python,google-app-engine,Python,Google App Engine,我想让学生能够提交一些简单python问题的python代码解决方案。我的应用程序将在GAE中运行。我如何限制被使用的恶意代码的风险?我意识到这是一个很难解决的问题,我读过相关的Stackoverflow和其他关于这个主题的帖子。我很好奇,GAE环境中的限制是否使限制不可信代码可能造成的损害变得更简单。是否可以简单地在提交的代码中扫描几个受限制的关键字(exec、import等),然后确保代码只运行不到固定的时间,或者即使在受限制的GAE环境中也很难对不受信任的代码进行沙箱处理?例如: # Im

我想让学生能够提交一些简单python问题的python代码解决方案。我的应用程序将在GAE中运行。我如何限制被使用的恶意代码的风险?我意识到这是一个很难解决的问题,我读过相关的Stackoverflow和其他关于这个主题的帖子。我很好奇,GAE环境中的限制是否使限制不可信代码可能造成的损害变得更简单。是否可以简单地在提交的代码中扫描几个受限制的关键字(exec、import等),然后确保代码只运行不到固定的时间,或者即使在受限制的GAE环境中也很难对不受信任的代码进行沙箱处理?例如:

# Import and execute untrusted code in GAE
untrustedCode = """#Untrusted code from students."""

class TestSpace(object):pass
  testspace = TestSpace()

try:
  #Check the untrusted code somehow and throw and exception.
except:
   print "Code attempted to import or access network"


try:
    # exec code in a new namespace (Thanks Alex Martelli)
    # limit runtime somehow
    exec untrustedCode in vars(testspace)
except:
    print "Code took more than x seconds to run"

@mjv的笑脸评论实际上是一针见血的:确保提交者已被识别并与相关代码相关联(可能会被发送到任务队列),并记录由个人提交引起的任何诊断

除此之外,您还可以准备一个更严格的测试空间(感谢您的确认;-),包括一个特殊的“内置”,它包含您希望学生能够使用和重新定义的所有内容。再加上一个禁止exec、eval、import、
\uuuuuuuu子类、
\uuuuuuuuu基类、
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuu。然而,在GAE环境中,一个完全安全的沙盒是一个真正的挑战,除非你能将学生允许使用的语言的一小部分列入白名单


因此,我建议采用分层方法:学生上传并执行代码的沙盒GAE应用程序基本上没有持久层可担心;相反,它通过向另一个应用程序发送urlfetch请求来“持久化”,该应用程序从不运行任何不受信任的代码,并且能够非常严格地审查每个请求。白名单的默认拒绝仍然是圣杯,但有了这样一个额外的安全层,您可能能够接受黑名单的默认接受…

您真的无法在应用程序引擎中以任何程度的确定性沙箱Python代码。Alex的想法是记录谁在运行什么是好的,但是如果用户设法打破沙箱,他们可以删除事件日志。该信息唯一安全的地方是每个请求的日志记录,因为用户无法删除该信息

有关试图对Python进行沙箱处理的鼠洞的示例,请参阅。有关Guido对保护Python的看法,请参阅

还有两个选项:如果您可以自由选择语言,您可以在Java运行时运行Rhino(Javascript解释器);犀牛是很好的沙盒。你也可以使用Jython;我不知道使用沙箱是否切实可行,但似乎很有可能


Alex建议使用一个单独的应用程序也是一个很好的建议。这几乎就是我们所采取的方法:它不能阻止你做恶意的事情,但应用本身并没有存储任何有价值的东西,所以如果你这样做,也不会有任何伤害。

这里有一个想法。使用Skuplt在客户端运行代码,而不是在服务器端运行代码:


这既更安全,也更容易实现。

学生永远不会这样做[提交风险代码]:-)基于这种观点,您认为将python测试和解决方案对下载到Linux系统并在临时Linux用户帐户中运行更简单(更安全)吗?我真正需要得到的是执行后的文本输出,我可以在执行后立即删除临时Linux帐户,以清除任何恶魔。@克里斯,当然可以——如果你能安排在帐户上运行不受信任的代码的话(特别是限制配额的系统,它甚至不能尝试拒绝服务攻击——无论是在运行它的机器上,还是在其他任何机器上)您都会更安全。SysAdm“从永远”向不受信任的用户(包括学生)提供帐户你的学生将从这种安排中获得更多的自由度,但很少有特权的成功升级(“rootkit”;-)攻击。谢谢尼克。如果shell.appspot.com已经允许匿名用户在appspot上执行不受信任的代码,那么这个示例应用程序不是已经解决了不受信任的代码问题吗?只要我限制代码可以运行的时间并限制对URL获取的访问,学生在我的shell副本中做什么会有风险?换句话说,w为什么我不能匿名滥用shell.appspot.com,不管我的学生可能会以何种方式试图滥用我的应用程序?好吧,它或多或少地通过忽略它来“解决”这个问题:shell应用程序本身是沙盒的,虽然它不能阻止你对它做任何你想做的事情,但你不能逃避沙盒,对其他应用程序造成伤害,或者修改shell应用程序以获取帮助其他用户。你不能直接限制你的学生可以使用的时间量-但运行时系统无论如何会在30秒后终止请求。你也不能阻止他们使用URLFetch,尽管你可能会使其变得相当困难。再次感谢Nick。我想我正朝着修改GAE shell应用程序并传递消息的方向前进它将我的问题和学生的解决方案作为字符串。我似乎能够在shell.appspot.com中以这种方式评估字符串和检查问题,没有太多困难。感谢您的洞察力。