gpt4 book ai didi

python - 在将 python 表达式传递给 eval() 之前解析、保护它

转载 作者:太空狗 更新时间:2023-10-30 02:35:35 27 4
gpt4 key购买 nike

我想从用户那里获取输入可能像 foo() > 90 and boo() == 9 or do() > 100 并在服务器端使用 eval 来评估这个表达式。

为了安全起见,我想在将其传递给 eval 函数之前通过检查(针对某些数据结构)来限制用户添加有限的函数和运算符。

PS:输入来自网页

谢谢

最佳答案

基本上唯一的方法就是自己解析它。您导航解析树以确保每个部分都在完全良性和安全操作的白名单中,从而通过构造使整个表达式安全。 Ned Batchelder 的回答实际上是一个(简单的)形式。之后您可以将它传递给 eval(),但这有什么意义呢?您可以计算每个子表达式的值作为验证的一部分(这是一个特别好的主意,因为它使您的解析器能够抵抗 Python 语法等的变化)。这个白名单必须非常小,并且有很多东西你可能认为没问题,但实际上不是(例如通用调用运算符;getattr 函数)。你必须非常小心。

黑名单是绝对不可能的(比如“拒绝可疑条目”的建议)。拒绝任何明显不好的东西。如果您不这样做,那么绕过您的过滤器并给出一个做坏事的表达式将是微不足道的,除非您的代码比任何其他 Python 黑名单过滤器更好。

已经有人尝试限制 Python 的执行,一个是臭名昭著的,现在已被禁用(因为它不起作用)rexec模块(和公司),另一个是 PyPy's sandbox .第二个选项并不完全符合您的要求,但它确实值得研究。这可能是我会使用的——它只是意味着它不会像 eval(safematize(user_input)) 那样简单。

关于python - 在将 python 表达式传递给 eval() 之前解析、保护它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2065331/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com