当前位置:  开发笔记 > 编程语言 > 正文

Python的eval()在不受信任的字符串上的安全性?

如何解决《Python的eval()在不受信任的字符串上的安全性?》经验,为你挑选了4个好方法。

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

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

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

    eval(string, {"f": Foo()}, {})不安全的?也就是说,你可以从Foo实例到达os或sys或者不安全的东西吗?

    eval(string, {}, {})不安全的?也就是说,我可以完全从内置像len和list到达os或sys吗?

    有没有办法让eval上下文中的内置函数不存在?

有一些不安全的字符串,如"[0]*100000000",我不在乎,因为在最坏的情况下,他们会减慢/停止程序.我主要关心的是保护程序外部的用户数据.

显然,eval(string)在大多数情况下,没有自定义词典是不安全的.



1> Jerub..:

eval() 将允许恶意数据危害您的整个系统,杀死您的猫,吃掉您的狗并与您的妻子做爱.

最近有一个关于如何在python-dev列表上安全地做这种事情的线程,结论是:

这样做真的很难.

它需要python解释器的补丁来阻止许多类攻击.

除非你真的想要,否则不要这样做.

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

你想在什么情况下使用eval()?您是否希望用户能够执行任意表达式?或者您想以某种方式传输数据?也许有可能以某种方式锁定输入.


@S.Lott - 安全背后的驱动思路不是*防止*坏事发生而不是事后希望你们都能识别攻击者并说服他们不要再这样做了吗?为什么不鼓励良好做法?
+1:谁是恶意的人插入您正在评估的恶意代码?找到那个人 - 认真."eval是不安全的"大部分都假设是在挥舞着一些无人能够识别出来的邪恶的人.
在大型互联网上编写不受信任的代码以在您的系统上运行的任何情况都要求不受信任的人员无法攻击."这个人是谁" - 如果你用eval()写了一些不安全的东西,我知道吗?我会告诉你,你不应该这样做.

2> Ned Batcheld..:

您不能使用这样的黑名单方法来保护eval.对于将对CPython解释器进行分段,提供对您喜欢的任何类的访问等的输入示例,请参阅Eval确实很危险.



3> John Fouhy..:

你可以os使用内置函数:__import__('os').

对于python 2.6+,ast模块可能有所帮助; 特别是ast.literal_eval,虽然它完全取决于你想要评估的内容.



4> Benjamin Pet..:

请注意,即使您将空字典传递给eval(),仍然可以使用一些语法技巧来段落(C)Python.例如,在解释器上试试这个:eval("()"*8**5)

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有