当前位置: 首页 > 面试题库 >

使用eval进行表达评估的安全性如何?

巫懿轩
2023-03-14
问题内容

我正在建立一个网站,我需要用户应该能够根据数据库表中的值来评估某些表达式,而不是使用pyparsing等工具,而是考虑使用python本身,并提出了一个解决方案这足以满足我的目的。我基本上是使用eval来评估表达式,并以空传递全局变量dict,__builtins__这样就无法访问任何内容,而从数据库获取值的局部变量dict
,如果用户需要一些函数,我也可以传递这些函数

import datetime
def today():
    return datetime.datetime.now()

expression = """ first_name.lower() == "anurag" and today().year == 2010 """

print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})

所以我的问题是,它将有多安全,我有三个条件

  1. 用户可以访问我的程序或表等的当前状态吗?
  2. 用户可以访问操作系统级别的呼叫吗?
  3. 用户可以通过循环或使用大量内存(例如通过执行range(10 * 8))来停止我的系统,在某些情况下可以做到100 ** 1000等,因此3并不是什么大问题。我可能会用tokenize检查此类操作,无论如何,我将使用GAE,所以它不是很多问题。

编辑 :IMO这不是Q:661084的重复项,因为它从此结束开始,我想知道即使__builtins__被阻止,用户也可以做坏事吗?


问题答案:

这是完全不安全的使用eval,甚至内置插件清空受阻-
攻击者可以用文字开始,得到它__class__,等,等,最多object,它的__subclasses__,等等…基本上,Python的自省是太强烈抵抗熟练,坚定的攻击者。

ast.literal_eval
安全的,如果您可以忍受其局限性…



 类似资料:
  • 本文向大家介绍Python用eval评估表达式,包括了Python用eval评估表达式的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 本文向大家介绍Python使用自定义全局变量使用eval评估表达式,包括了Python使用自定义全局变量使用eval评估表达式的使用技巧和注意事项,需要的朋友参考一下 示例 此外,此代码不能偶然引用外部定义的名称: defaultdict例如,使用可以将未定义的变量设置为零:            

  • 问题内容: 我需要在Javascript中评估用户输入的算术表达式,例如“ 2 *(3 + 4)”,但出于安全原因,我不想使用它。 我可以去除所有不是数字或运算符的字符,但是我不确定这是否安全,如果用户可以使用,,等功能,那会很好。 是否有进行算术表达式评估的Javascript库? 问题答案: 您可以尝试使用JavaScript Expression Evaluator: 该库是Raphael

  • 问题内容: 给定两个数据框 我想使用对一列或多列进行算术运算pd.eval。具体来说,我想移植以下代码: …使用进行编码eval。使用的原因eval是我想自动执行许多工作流程,因此动态创建它们对我很有用。 我试图更好地理解和参数,以确定如何最好地解决我的问题。我已经浏览了文档,但是对我而言,区别并不明显。 应该使用什么参数来确保我的代码以最高性能工作? 有没有一种方法可以将表达式的结果赋值给df2

  • 我理解经典例子的问题 但我无法说服自己以下是有效的还是无效的 我知道'foo(i)'和'i'的求值顺序是不确定的,但是'评估'到底是什么意思?也就是说bar的第二个参数总是42,或者'i'的当前值可以在foo改变它之前被传入吗?

  • 问题内容: 我正在寻找简单条件表达式的评估器。表达式应包含变量(只读),字符串,数字和一些基本运算符。 例如,这样的表达式: 到目前为止,我实现了一个相当“神奇”的解析器,该解析器返回可以评估的AST,但我不敢相信我是解决该问题的第一个。 我可以使用哪些现有代码代替? 问题答案: SPEL(Spring Expression Lang)怎么样?http://static.springsource.