Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python的安全性';s eval()在不受信任的字符串上?_Python_Security_Eval - Fatal编程技术网

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

Python的安全性';s eval()在不受信任的字符串上?,python,security,eval,Python,Security,Eval,如果我使用eval()计算Python字符串,并使用如下类: class Foo(object): a = 3 def bar(self, x): return x + a 如果我不信任字符串,有什么安全风险?特别是: eval(字符串,{“f”:Foo()},{})不安全吗?也就是说,您能从Foo实例访问os或sys或其他不安全的东西吗 eval(string,{},{})不安全吗?也就是说,我能完全从len和list这样的内置设备访问os或sys吗 有没有一种方法可以使内置

如果我使用eval()计算Python字符串,并使用如下类:

class Foo(object):
    a = 3
    def bar(self, x): return x + a
如果我不信任字符串,有什么安全风险?特别是:

  • eval(字符串,{“f”:Foo()},{})
    不安全吗?也就是说,您能从Foo实例访问os或sys或其他不安全的东西吗
  • eval(string,{},{})
    不安全吗?也就是说,我能完全从len和list这样的内置设备访问os或sys吗
  • 有没有一种方法可以使内置代码在eval上下文中根本不存在
  • 有一些不安全的字符串,如“[0]*100000000”,我不在乎,因为最坏的情况下,它们会减慢/停止程序。我主要关心的是保护程序外部的用户数据

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

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

    最近在python开发列表中出现了一条关于如何安全地执行此类操作的线索,结论如下:

    • 这真的很难做好
    • 它需要python解释器的补丁来阻止许多类型的攻击
    • 除非你真的想做,否则不要做
    从这里开始阅读挑战:


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

    你最好把问题转过来:

  • 你想评估哪种表达方式
  • 您能否确保只有与某些狭义定义的语法匹配的字符串才是eval()d
  • 然后考虑是否安全。

    例如,如果你想让用户输入一个代数表达式进行评估,考虑将它们限制为一个字母变量名、数字和一组特定的运算符和函数。不要eval()字符串包含任何其他内容。

    请注意,即使将空字典传递给eval(),也可以使用一些语法技巧来分隔Python。例如,在您的解释器上尝试以下操作:
    eval(“()”*8**5)
    您可以使用内置函数访问
    os
    \uu导入('os')

    对于Python2.6+,可能会有所帮助;特别是
    ast.literal\u eval
    ,尽管它完全取决于您要评估的内容。

    Mark Pilgrim的教程中有一个非常好的例子

    引自本文:

    最终,我们有可能安全地 计算不受信任的Python表达式, 对于“安全”的一些定义 事实证明,这对我来说不是很有用 现实生活。如果你只是 到处玩,如果你 只有通过受信任的输入才能传递它。但是 其他的都是我的要求 麻烦


    这样的黑名单方法无法确保eval的安全。请参阅,以获取将对CPython解释器进行分段、允许访问任何您喜欢的类等的输入示例。

    是的,如果您正在执行eval的字符串中有import sys.dostuff,并且您不信任字符串,则这些内容可能会变得非常丑陋。eval有一个很好的属性,它只允许表达式。所以像=、导入和打印这样的东西是不允许的。试试
    eval(“\uuu import\uuuusys”).stdout.write(“Hello Joe”)
    @S.Lott——如果他在写加密程序,那就是Carol或Eve,和电子邮件处理的s。kiddie@aol.com但我不知道我们是否在一般情况下确定了它是谁。我想先问一下你为什么要这么做。这是一个名为“28c3:不安全的科学”的视频,描述了程序之间的接口。www.youtube.com/watch?v=3kEfedtQVOY它强烈鼓励输入消息是常规的或上下文无关的。@S.Lott-安全性背后的驱动思想之一不是为了防止坏事发生,而不是事后希望您能够识别攻击者并说服他们不要再这样做吗?为什么不鼓励良好做法?在任何情况下,如果一个人在更大的互联网上编写不受信任的代码在您的系统上运行,则要求不受信任的人无法进行攻击。“这个人是谁”-如果你用eval()写了一些不安全的东西,而我知道?我要告诉你你不应该那样做。哇,为什么会导致segfault?它会溢出编译器的堆栈。链接不再有效。@gingerplus:谢谢,马克似乎已经移动了他的域。我已经更新了链接。