我有一个字符串,我需要确保它只包含一个正则表达式而不包含javascript,因为我正在创建一个带有字符串的新脚本,因此javascript片段会带来安全风险。
确切方案:
如何在不破坏正则表达式的情况下如何转义字符串?
答案 0 :(得分:0)
您可以使用正则表达式来拆分JavaScript正则表达式。
然后你应该将正则表达式转换为一个词法上更简单的JavaScript子集,它避免了所有关于/
的含义的非上下文无关紧要以及输入正则表达式中的任何不规则性。
var REGEXP_PARTS = "(?:"
// A regular character
+ "[^/\r\n\u2028\u2029\\[\\\\]"
// An escaped character, charset reference or backreference
+ "|\\\\[^\r\n\u2028\u2029]"
// A character set
+ "|\\[(?!\\])(?:[^\\]\\\\]|\\\\[^\r\n\u2028\u2029])+\\]"
+ ")";
var REGEXP_REGEXP = new RegExp(
// A regex starts with a slash
"^[/]"
// It cannot be lexically ambiguous with a line or block comemnt
+ "(?![*/])"
// Capture the body in group 1
+ "(" + REGEXP_PARTS + "+)"
// The body is terminated by a slash
+ "[/]"
// Capture the flags in group 2
+ "([gmi]{0,3})$");
var match = myString.match(REGEXP_REGEXP);
if (match) {
var ctorExpression =
"(new RegExp("
// JSON.stringify escapes special chars in the body, so will
// preserve token boundaries.
+ JSON.stringify(match[1])
+ "," + JSON.stringify(match[2])
+ "))";
alert(ctorExpression);
}
将导致表达式在一个易于理解的JavaScript子集中。
上面的复杂正则表达式不在TCB中。需要正确运行才能保持安全性的唯一部分是ctorExpression
,包括使用JSON.stringify
。
答案 1 :(得分:0)
似乎大多数标准JavaScript功能都可用(source),所以你可以这样做:
try {
RegExp(json.something+'');
pacFile += 'RegExp(' + JSON.stringify(json.something+'') + ')';
} catch(e) {/*handle invalid regexp*/}
不用担心,因为RegExp("console.log('test')")
只生成有效的/console.log('test')/
正则表达式并且不执行任何操作。