美文网首页
更安全的 eval

更安全的 eval

作者: kingron | 来源:发表于2021-12-13 18:13 被阅读0次

问题

想要将一段列表形式的字符串转为 list,但是担心这个动态的字符串可能是恶意的代码?使用 eval 将带来安全隐患。比如:

# 期望是
eval('[1, 2, 3]')

# 实际上是
eval("os.popen('rm -rf *')")

解决方案

使用 ast.literal_eval 可以很好的避免这个问题,该函数可以安全执行仅包含文字的表达式字符串。支持的对象有字符串、字节、数字、元组、列表、字典、集合、 布尔值、NoneEllipsis。这些是可以嵌套的,比如以字典作为元素的列表:

>>> from ast import literal_eval
>>> literal_eval("[{'name': 'john', 'location': 'halo7'}]")
[{'name': 'john', 'location': 'halo7'}]

注意 literal_eval 不可以执行任何复杂的表达式,比如包含运算符或是有索引的表达式都是不支持的,会直接抛出异常。这也保证了它不会执行恶意代码。

拓展

  • 使用 literal_eval 时,足够复杂或是巨大的字符串可能导致 Python 解释器的崩溃,因为 Python 的 AST 编译器是有栈深限制的
  • literal_eval 解析异常时,可能会抛出 ValueError, TypeError, SyntaxError, MemoryErrorRecursionError,这取决于传入的字符串

相关文章

  • 更安全的 eval

    问题 想要将一段列表形式的字符串转为 list,但是担心这个动态的字符串可能是恶意的代码?使用 eval 将带来安...

  • 警惕eval()的安全漏洞

    eval() 函数用来执行一个字符串表达式,并返回表达式的值。 eval(expression[, globals...

  • (1, eval)('this') eval('this')

    (1, eval)('this') eval('this') 两者有什么不同 (1,eval)和普通的eval函...

  • JavaScript基础整理(三)

    eval它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2次,一次解析成j...

  • is eval evil?

    最近项目中, 一个为了确保安全性而做的任务是移除代码中的eval. 我对eval的不好略有耳闻, 但是它到底有多不...

  • eval作用域

    输出 原因: (1,eval)是个表达式,;类似1&&eval,属于间接引用了eval; eval 只在被直接调用...

  • PHP代码执行

    Eval函数介绍 Eval函数的语法如下: eval ( string $code ) $code是字符串型变量,...

  • JS之eval()

    Javascript 之 eval() 语法 eval(string) 描述 eval()是一个顶级函数并且跟任何...

  • 12.1、python内置函数——eval、exec、compi

    内置函数——eval、exec、compile eval()将字符串类型的代码执行并返回结果 print(eval...

  • 你所不知道的eval

    首先,eval是什么?MDN对eval的解释是: eval() 函数会将传入的字符串当做 JavaScript 代...

网友评论

      本文标题:更安全的 eval

      本文链接:https://www.haomeiwen.com/subject/vjqsfrtx.html