Вы можете использовать регулярное выражение, чтобы разделить регулярное выражение 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
.
Регулярные регулярные выражения. Я сомневаюсь, что можно будет правильно сопоставить регулярное выражение с регулярным выражением. –
Итак, строка считывается/преобразуется из файла? Это означает, что вы не можете отделять конструкторы регулярных выражений от всего остального. – sln
Как указано выше, строка взята из json-файла, загруженного через httprequest. Но из-за проблем безопасности с Mozilla (имеет смысл и для меня), мне нужно убедиться, что строка действительно содержит регулярное выражение и ничего больше. Если он будет содержать javascript вместо регулярного выражения, js будет выполняться в файле pac. –