如果我评估Python字符串中使用eval(),并有一个类似的:

class Foo(object):
    a = 3
    def bar(self, x): return x + a

什么是安全的风险,如果我不信任字符串?特别是:

  1. eval(string, {"f": Foo()}, {}) 不安全?那是,你可以达到操作系统或系统或类不安全的从Foo实例?
  2. eval(string, {}, {}) 不安全?是的,我可以达到操作系统或系统完全由内置喜欢len和列表吗?
  3. 有一种方法,使内置不存在的所有在eval背景下?

有一些不安全strings like"[0]*100000000"我不关心,因为他们在最坏的情况减慢或停止程序。我主要关注保护用户的数据的外部节目。

显然, eval(string) 没有字典定义是不安全,在大多数情况下。

有帮助吗?

解决方案

你无法安全eval有一个黑名单的方法这样。看看 Eval真的是很危险的 例的输入,这将出现段错误的CPython解释,给予访问的任何类似,等等。

其他提示

eval() 将允许恶意数据的妥协你的整个系统,杀了你的猫吃你的狗做爱你的妻子。

那里是最近的一个线程有关如何做这种事情上的安全蟒蛇开发表,结论是:

  • 这真的很难正确地做到这一点。
  • 它需要修补程序向python解释框许多类的攻击。
  • 不这样做,除非你真的想。

从这里开始阅读有关的挑战: http://tav.espians.com/a-challenge-to-break-python-security.html

什么情况下你想用eval()?你想要一个用户能够执行任意的表情?或者是你想要转移数据在某种方式?也许这是可以锁定输入在某些方面。

你可以得到 os 使用系统的功能: __import__('os').

Python2.6, ast模块 可以帮助;特别是 ast.literal_eval, 虽然它完全取决于你想要什么eval。

注意,甚至如果你通过空字典eval(),它仍然有可能出现段错误(C)蟒蛇一些法技巧。例如,试试这个在你的解释: eval("()"*8**5)

你可能好转的问题:

  1. 什么样的表情是你想要eval?
  2. 你能保证只串匹配的一些狭义定义的语法eval()d?
  3. 然后如果考虑 是安全的。

例如,如果你想让用户输入一个代数表达式进行评估,考虑限制它们一个字母的变量名称、数字和一套具体的运营商和功能。不eval()串包含其他任何东西。

有一个非常好的 文章在联合国安全 eval() 在马克朝圣者的 潜入蟒蛇 教程。

引自这篇文章:

最后,它能够安全地 评估不可信的蟒蛇的表达, 对于一些定义中的"安全", 原来不是非常有用 真实的生活。这很好,如果你只是 玩弄,这很好,如果你 只有通过它的可信输入。但 什么都是只要求 麻烦。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top