【问题标题】:Eval not working on multi-line string评估不适用于多行字符串
【发布时间】:2015-06-05 16:35:22
【问题描述】:

我在使用 python eval 函数执行多行字符串时遇到问题/

code = ''' 

def main():
  print "this is a test"

main()

'''

eval(code)

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    eval(code)
  File "<string>", line 3
    def main():
      ^
SyntaxError: invalid syntax

【问题讨论】:

  • 通常不推荐使用eval。你为什么要这样做?
  • IanAuld 我正在编写一个自动 python 分级器,它首先必须执行 Flask 服务器上的 GET 请求接收到的代码
  • @JohnGalt:所以您想执行从网络客户端发送给您的任意代码?这是一个等待发生的安全漏洞,无论用户发送什么都可以轻松接管您的网络进程。
  • 我知道,但我会有一个保护系统,防止文件操作和 sql 注入以及其他安全漏洞。

标签: python eval


【解决方案1】:

eval 只能评估Python expressions,不能评估语句。函数定义是语句,而不是表达式。

使用exec 执行 Python 语句。

查看Top-level components document,它区分了file inputexpression input

file_input ::=  (NEWLINE | statement)*

此语法用于以下情况:

[...]

  • 解析传递给exec语句的字符串时;

[...] eval() 的字符串参数必须具有以下形式:

eval_input ::=  expression_list NEWLINE*

不要使用它来执行不受信任的用户提供的文本。 eval()exec 没有防范恶意用户,如果您使用它,他们可以并且接管网络进程。

事实上,没有任何“安全”的方法可以做到这一点,除了在所有服务都牢牢关闭的一次性虚拟机中运行代码。为新代码运行新虚拟机,完成或超时后丢弃整个 VM。

【讨论】:

  • 我还能用 exec 存储代码的评估结果吗?
  • 我想补充一点,除非您真的知道自己在做什么,否则您正在尝试做的事情听起来有点像糟糕的设计。但是谁知道约翰·高尔特在做什么呢?
  • @JohnGalt:表达式有值,语句不需要。例如,函数def 没有值,它只是定义函数(然后在本地命名空间中有一个具有值的条目,即Callable,但这是另一回事!)
  • @JohnGalt:这就是它被称为eval 的原因:它可以评估表达式的值。没有价值的东西不能evaled,即使你可以,也不会有价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 2015-01-30
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多