You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安全执行字符串格式的布尔比较表达式?

不使用eval执行布尔表达式的替代方法
  • 手动实现简易布尔表达式求值逻辑
    针对仅包含true/false、&&、||的表达式,可利用运算符优先级(&&高于||)分步计算:

    1. 按||分割表达式,得到多个子表达式;
    2. 对每个子表达式按&&分割,检查所有片段是否为true(子表达式结果为所有片段的逻辑与);
    3. 只要有一个子表达式结果为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:55:16