Python eval() 只接受条件



我从文本框中输入了以下形式的文本:

gzip == True

gzip == False and count >= 100

gzip == True or msg == "Hello!"

我使用 eval(( 来获取条件的结果。但是,像代码注入这样的 eval 存在明显的"安全问题"。

有什么方法可以将其限制在条件下吗?我不需要它做其他任何事情。

正如@scotty3785提到的,您需要创建一个单独的函数来检查所需某些操作的输入。然后将输入传递给 ast.literal_eval(node_or_string) 。我完全会避免使用eval()

是的,使用评估存在安全问题。我认为您应该使用 pyparsing 将表达式解析为令牌列表,然后处理令牌。您可以找到更多http://pyparsing.wikispaces.com/

pyparsing是一个

不错的选择。如果你不想定义语法和所有的爵士乐,你可以尝试的另一个选择是:

safe_variables = {} # use this to define safe functions and variables
code = "...."
eval(code, {"__builtins__": None}, safe_variables)

通过传递带有内置显式设置None的字典,您可以确保代码无法访问Python的内置函数,例如(abs,open,filter等(。如果未显式设置为 None,则将复制当前全局变量。

这在很大程度上锁定了代码。接下来,显式列出您希望代码在safe_variables字典中有权访问的变量和函数。

最新更新