我想让学生为一些简单的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"
Alex Martell.. 5
@mjv的笑脸评论实际上是正确的:确保提交者被识别并与相关代码相关联(可能会将其发送到任务队列),并记录由个人提交的任何诊断.
除此之外,您确实可以准备一个更具限制性的测试空间(感谢您的确认;-)包括一个特殊的" 内置 ",其中包含您希望学生能够使用和重新定义的所有内容__import__
.这样,再加一个令牌传递到禁止高管,EVAL,进口,__subclasses__
,__bases__
,__mro__
,...,让你更接近.然而,在GAE环境中完全安全的沙箱是一个真正的挑战,除非您可以将允许学生的一小部分语言列入白名单.
所以我建议采用分层方法:学生上传和执行代码的沙盒GAE应用程序基本上没有持久层需要担心; 相反,它通过向另一个应用程序发送urlfetch请求来"持久化",该应用程序从不运行任何不受信任的代码,并且能够非常严格地审查每个请求.使用白名单的默认拒绝仍然是圣杯,但有了这样一个额外的安全层,你可能能够承担黑名单的默认接受......
@mjv的笑脸评论实际上是正确的:确保提交者被识别并与相关代码相关联(可能会将其发送到任务队列),并记录由个人提交的任何诊断.
除此之外,您确实可以准备一个更具限制性的测试空间(感谢您的确认;-)包括一个特殊的" 内置 ",其中包含您希望学生能够使用和重新定义的所有内容__import__
.这样,再加一个令牌传递到禁止高管,EVAL,进口,__subclasses__
,__bases__
,__mro__
,...,让你更接近.然而,在GAE环境中完全安全的沙箱是一个真正的挑战,除非您可以将允许学生的一小部分语言列入白名单.
所以我建议采用分层方法:学生上传和执行代码的沙盒GAE应用程序基本上没有持久层需要担心; 相反,它通过向另一个应用程序发送urlfetch请求来"持久化",该应用程序从不运行任何不受信任的代码,并且能够非常严格地审查每个请求.使用白名单的默认拒绝仍然是圣杯,但有了这样一个额外的安全层,你可能能够承担黑名单的默认接受......