我想让同学们提交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 的笑脸评论实际上是正确的:确保提交者被识别并与有问题的代码相关联(大概将被发送到任务队列),并记录由个人提交引起的任何诊断。
除此之外,您确实可以准备一个更具限制性的测试空间(感谢您的认可;-)包括一个特殊的“内置”,它拥有您希望学生能够使用的所有内容并重新定义 __import__
&c。那,再加上禁止执行、评估、导入、__subclasses__
、__bases__
、__mro__
...的 token 传递,让你更接近。然而,在 GAE 环境中实现完全安全的沙箱是一个真正的挑战,除非您可以将允许学生使用的一小部分语言列入白名单。
所以我建议采用分层方法:学生上传和执行代码的沙盒 GAE 应用程序基本上没有需要担心的持久层;相反,它通过向另一个应用程序发送 urlfetch 请求来“坚持”,该应用程序从不运行任何不受信任的代码,并且能够非常严格地审查每个请求。带有白名单的默认拒绝仍然是 chalice ,但是有了这样一个额外的安全层,您可以负担得起带有黑名单的默认接受...
关于python - 在 GAE 中的 Python 中,限制执行不受信任代码的风险的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1496115/