我想让学生为一些简单的
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请求来“持久化”,该应用程序从不运行任何不受信任的代码,并且能够非常严格地审查每个请求.使用白名单的默认拒绝仍然是圣杯,但有了这样一个额外的安全层,你可能能够承担黑名单的默认接受……