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

我想让学生为一些简单的
python问题提交
python代码解决方案.我的应用程序将在GAE中运行.如何限制sumios的源代码的风险?我意识到这是一个难题,我已经阅读了相关的Stackoverflow和其他帖子.我很好奇,如果在GAE环境中适当的限制使得更容易限制不受信任的代码可能造成的损害.是否可以简单地扫描提交的代码以获取一些受限制的关键字(执行,导入等),然后确保代码仅运行不到一段固定的时间,或者即使在resticted 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的笑脸评论实际上是正确的:确保提交者被识别并与相关代码相关联(可能会将其发送到任务队列),并记录由个人提交的任何诊断.

除此之外,您确实可以准备一个更具限制性的测试空间(感谢您的确认;-)包括一个特殊的“内置”,其中包含您希望学生能够使用的所有内容并重新定义__import__& c.加上一个令牌传递给禁止的exec,eval,import,_ _ subclasses __,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _然而,在GAE环境中完全安全的沙箱是一个真正的挑战,除非您可以将允许学生的一小部分语言列入白名单.

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

点赞