如果我使用eval()评估Python字符串,并且有一个类如下:
class Foo(object):
a = 3
def bar(self, x): return x + a
Run Code Online (Sandbox Code Playgroud)
如果我不信任字符串会有什么安全风险?特别是:
eval(string, {"f": Foo()}, {})不安全的?也就是说,你可以从Foo实例到达os或sys或者不安全的东西吗?eval(string, {}, {})不安全的?也就是说,我可以完全从内置像len和list到达os或sys吗?有一些不安全的字符串,如"[0]*100000000",我不在乎,因为在最坏的情况下,他们会减慢/停止程序.我主要关心的是保护程序外部的用户数据.
显然,eval(string)在大多数情况下,没有自定义词典是不安全的.
Jer*_*rub 46
eval() 将允许恶意数据危害您的整个系统,杀死您的猫,吃掉您的狗并与您的妻子做爱.
最近有一个关于如何在python-dev列表上安全地做这种事情的线程,结论是:
从这里开始阅读有关挑战的信息:http://tav.espians.com/a-challenge-to-break-python-security.html
你想在什么情况下使用eval()?您是否希望用户能够执行任意表达式?或者您想以某种方式传输数据?也许有可能以某种方式锁定输入.
请注意,即使您将空字典传递给eval(),仍然可以使用一些语法技巧来段落(C)Python.例如,在解释器上试试这个:eval("()"*8**5)
| 归档时间: |
|
| 查看次数: |
12265 次 |
| 最近记录: |