我想安全地使用用户输入的正则表达式来解析文本。我不想使用沙箱或任何东西。我可以将正则表达式插入String.match
还是会导致问题?如果不是,如何避免这种情况?
用例是具有大量文本的作家的用例。作者将使用各种正则表达式转换该文本。其他用户将运行该作者的正则表达式以获得预期的输出。
我想安全地使用用户输入的正则表达式来解析文本。我不想使用沙箱或任何东西。我可以将正则表达式插入String.match
还是会导致问题?如果不是,如何避免这种情况?
用例是具有大量文本的作家的用例。作者将使用各种正则表达式转换该文本。其他用户将运行该作者的正则表达式以获得预期的输出。
这不应导致任何安全错误。更糟糕的情况是您使用了无效的正则表达式字符串。除非我误解了这个问题。
编辑更糟糕的情况是锁定您自己的浏览器。感谢 Anirudh 提出这一点。
如果您在字符串中有用户输入,则可以将其直接传递给构造函数。
var s = "This is my text";
$('input#expression').keyup(function(){
var e = new RegExp($(this).val());
$('#match').text(
JSON.stringify(s.match(e))
);
}).trigger("keyup");
它比eval
. 据我所知,没有任何安全问题。如果有的话,很可能是浏览器中的一个错误。
正如评论中所指出的,在 JavaScript 中区分安全和计算密集/不可行的表达式将非常复杂。
如果您不相信用户玩得很好,请不要让他们在彼此的计算机上运行表达式。至少,在需要刷新页面的情况下,确保保存用户数据,并且在用户未明确调用它们的情况下不要运行它们。
如果您使用的是 Javascript,它会在他们的机器上运行 - 因此不涉及沙箱。
他们可以随意弄乱他们的机器!除了可能发生的最糟糕的情况是脚本在他们的浏览器上中断。