gpt4 book ai didi

javascript - 如何安全地评估在 JavaScript 中表示为字符串的 bool 表达式?

转载 作者:搜寻专家 更新时间:2023-10-30 22:49:22 24 4
gpt4 key购买 nike

我有一份调查问卷,我希望根据表示为字符串的规则(例如 answers[1] == 'yes' || (answers[2] > 18 && answers[2] < 24))动态显示或隐藏问题。

这些规则直接来自数据库,并且总是评估为 true 或 false。如果为真,则显示问题;如果为假,则问题保持隐藏状态。对于前端,我使用的是 vue.js,这些规则作为 prop 传递,应该在运行时在组件内进行评估。

执行此操作的最佳方法是什么?

  • 出于测试目的,我尝试了 eval()它只是工作。但我知道这不是一个安全的选择,所以我正在寻找替代方案。

  • 我考虑过的另一种方法是用它们的值替换“answers[x]”的出现,因为我知道这是我必须访问的唯一变量。但最后这将输出到另一个必须评估的字符串。

  • 我看到有一个包叫做 safe-eval这会将 eval 函数沙盒化,我可以传递一个上下文,以便获得答案。我已经看到它在过去的版本中有一个相当大的安全漏洞,但应该被修复。这是一个不错的选择吗?

  • 是否有某种库可以帮助我编写解析器,或者提供一种编写规则和评估规则的方法?

编辑:我考虑 safe-eval 的原因首先,而不是自定义解析器,是因为我可以评估复杂的逻辑,而无需编写一个巨大的类来处理所有这些逻辑。

最佳答案

您可以只使用正则表达式来确保字符串符合您的格式,并且只有在它与正则表达式匹配时才运行 eval()。如果您需要创建正则表达式的引用,我推荐 https://regex101.com/

var rule = 'answers[1] > 18';
var regex = /^answers\[\d+\]\s>\s\d+$/;
var answers = [8, 27, 64];

if (rule.match(regex))
console.log(eval(rule));

关于javascript - 如何安全地评估在 JavaScript 中表示为字符串的 bool 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57692844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com