我从文本框中输入了以下形式的文本:
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
字典中有权访问的变量和函数。