检查字符串中包含正则表达式和无JS
问题描述:
我有一个字符串,我需要确保它仅包含一个正则表达式并没有JavaScript的,因为我创建与字符串的新脚本,这样一段JavaScript代码,将是一个安全风险。检查字符串中包含正则表达式和无JS
确切的情况:
- JS在Mozilla插件加载配置JSON通过的HttpRequest(JSON包含{ “东西”: “^(?:HTTP | HTTPS)://(:*)?”。 }
- JS创建一个使用“东西”正则表达式从配置
任何想法如何逃避串而不破坏它的正则表达式PAC文件(代理配置脚本)?
答
似乎大多数标准JavaScript功能都可以(source),所以你可以这样做:
try {
RegExp(json.something+'');
pacFile += 'RegExp(' + JSON.stringify(json.something+'') + ')';
} catch(e) {/*handle invalid regexp*/}
而且不用担心,因为一个RegExp("console.log('test')")
只会产生一个有效的/console.log('test')/
正则表达式和执行没有。
答
您可以使用正则表达式来拉开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
。
正则表达式不规则。我怀疑可以准确地将正则表达式与正则表达式匹配。 – 2014-08-28 15:35:07
那么,字符串是从文件读取/转换?这意味着你不能将正则表达式与其他任何东西分开。 – sln 2014-08-28 15:43:12
如上所述,该字符串来自通过httprequest加载的json文件。但是由于Mozilla的安全问题(对我来说也是有意义的),我需要确保该字符串确实包含一个正则表达式,而不是其他东西。如果它包含JavaScript而不是正则表达式,则js将在pac文件中执行。 – 2014-08-28 15:50:35