我正在研究几种情况,即接受几乎原始的代码会更加容易。所以,
另外,如果有人能想到给出d = {key:value,...}这样的expr,B是不必要的: expr.format(key)== d [key]
不改变格式的显示方式。
答案 0 :(得分:13)
使用表达式可以做的最糟糕的事情是
__import__('os').system('rm -rf /')
如果服务器进程以root
运行。否则,您可以使用
2**2**1024
或执行shell fork bomb:
使服务器暂停__import__('os').system(':(){ :|:& };:')
或者用Python本身执行一个临时的(但破坏性足够的)fork炸弹:
[__import__('os').fork() for i in xrange(2**64) for x in range(i)]
扫描__import__
无济于事,因为有无数种方法可以实现,包括
eval(''.join(['__', 'im', 'po', 'rt', '__']))
getattr(__builtins__, '__imp' + 'ort__')
getattr(globals()['__built' 'ins__'], '__imp' + 'ort__')
请注意,eval
和exec
函数也可用于以间接方式创建上述任何内容。如果要在服务器上进行安全表达式评估,请使用ast.literal_eval
。
答案 1 :(得分:3)
任意Python代码?
答案 2 :(得分:2)
任何数量的白名单或黑名单都不会阻止人们进入Python的危险部分。例如,您提到在沙箱中运行,其中未定义“打开”。但我可以做到这一点:
real_open = getattr(os, "open")
如果你说我不会os
,那么我可以这样做:
real_open = getattr(sys.modules['os'], "open")
或
real_open = random.__builtins__['open']
等等,等等。一切都是连通的,真正的力量就在那里。坏人会找到它。