如何安全执行字符串格式的布尔比较表达式?
不使用eval执行布尔表达式的替代方法
手动实现简易布尔表达式求值逻辑
针对仅包含true/false、&&、||的表达式,可利用运算符优先级(&&高于||)分步计算:- 按
||分割表达式,得到多个子表达式; - 对每个子表达式按
&&分割,检查所有片段是否为true(子表达式结果为所有片段的逻辑与); - 只要有一个子表达式结果为
true,整体表达式结果就是true。
示例代码(Python):
def evaluate_bool_expr(expr): or_parts = expr.split('||') for part in or_parts: and_parts = [p.strip().lower() == 'true' for p in part.split('&&')] if all(and_parts): return True return False # 测试示例 expr = "false || true || false || true && false && true" print(evaluate_bool_expr(expr)) # 输出: True- 按
使用安全的表达式求值库
很多语言都有专门的安全表达式求值库,比如Python的simpleeval,它会限制可执行的操作,只允许指定的运算符和变量,避免恶意代码执行。示例代码(Python):
from simpleeval import SimpleEval expr = "false or true or false or true and false and true" evaluator = SimpleEval(names={'true': True, 'false': False}) print(evaluator.eval(expr)) # 输出: True注:使用前需先安装库(
pip install simpleeval)。基于抽象语法树(AST)手动求值
利用语言的AST解析工具,将表达式字符串解析为抽象语法树,然后遍历节点实现自定义求值逻辑,完全控制允许的操作类型。示例代码(Python):
import ast class BoolExprEvaluator(ast.NodeVisitor): def visit_BoolOp(self, node): values = [self.visit(value) for value in node.values] if isinstance(node.op, ast.And): return all(values) elif isinstance(node.op, ast.Or): return any(values) raise ValueError("不支持的布尔运算符") def visit_Name(self, node): if node.id.lower() == 'true': return True elif node.id.lower() == 'false': return False raise ValueError(f"不支持的变量: {node.id}") def evaluate_ast(expr): tree = ast.parse(expr, mode='eval') evaluator = BoolExprEvaluator() return evaluator.visit(tree.body) # 测试示例 expr = "false or true or false or true and false and true" print(evaluate_ast(expr)) # 输出: True
内容的提问来源于stack exchange,提问作者Park Jang
相关产品推荐
相关产品推荐

