代码之家  ›  专栏  ›  技术社区  ›  flybywire

python:使eval安全[复制]

  •  34
  • flybywire  · 技术社区  · 16 年前

    我想用一种简单的方法在Python中实现“计算器API”。

    现在,我不太关心计算器将支持的确切功能集。

    我想让它接收一个字符串,比如 "1+1" 并返回一个包含结果的字符串,在我们的示例中 "2" .

    有办法吗 eval 安全吗?

    一开始我会的

    env = {}
    env["locals"]   = None
    env["globals"]  = None
    env["__name__"] = None
    env["__file__"] = None
    env["__builtins__"] = None
    
    eval(users_str, env)
    

    这样调用者就不会干扰我的局部变量(或者看到它们)。

    但我确信我在这里监督很多事情。

    埃瓦 的安全问题是可以解决的还是有太多的小细节使其正常工作?

    4 回复  |  直到 10 年前
        1
  •  50
  •   Alex Martelli    16 年前

    Eval的安全问题是否可以解决或 只是细节太多了吗 让它正常工作?

    当然是后者——一个聪明的黑客总会设法绕过你的防范措施。

    如果您对仅使用基本类型文本的纯表达式感到满意,请使用 ast.literal_eval --这就是它的目的!对于任何更复杂的问题,我建议使用解析包,例如 ply 如果您熟悉并熟悉经典的lexx/yacc方法,或者 pyparsing 可能更像蟒蛇的方法。

        2
  •  8
  •   Ned Batchelder    14 年前

    可以访问 任何 在进程中定义的类,然后可以实例化它并对其调用方法。可以对cpython解释器进行分段故障或使其退出。看到这个: Eval really is dangerous

        3
  •  2
  •   Katriel    16 年前

    安全问题(甚至接近)是不可解决的。

    我会用 pyparsing 要将表达式解析为标记列表(这不太难,因为语法很简单),然后单独处理标记。

    您也可以使用 ast 模块来构建一个python ast(因为您使用的是有效的python语法),但这可能会打开一些细微的安全漏洞。

        4
  •  1
  •   Dirk Bester    11 年前

    Perl有一个安全的评估模块 http://perldoc.perl.org/Safe.html

    googling“python equivalent of perl safe”发现 http://docs.python.org/2/library/rexec.html

    但是这个python的“restricted exec”被否决了。

    ——

    总的来说,“eval”安全,在任何语言中,都是一个大问题。SQL注入攻击只是这样一个安全漏洞的例子。PerlSafe多年来一直存在安全漏洞——我记得最近一次,它是安全的,除了从安全评估返回的对象上的析构函数。

    这是我自己的工具可能会用到的东西,但不会暴露在网络上。

    然而,我希望有一天,安全评估将在许多/任何语言中可用。