Проверьте, содержит ли строка регулярное выражение и нет js
У меня есть строка, и мне нужно убедиться, что она содержит только регулярное выражение и не содержит JavaScript, потому что я создаю новый сценарий со строкой, чтобы фрагмент кода JavaScript был угрозой безопасности.
Точный сценарий:
- JS в аддоне Mozilla загружает конфигурацию как json через HTTPrequest (json содержит {"что-то": "^(?: Http | https): // (?:. *)"}
- JS создает pac-файл (скрипт конфигурации прокси), который использует регулярное выражение "что-то" из конфигурации
Любые идеи, как избежать строки, не разрушая регулярное выражение в ней?
2 ответа
Кажется, что большинство стандартных функций JavaScript доступно ( исходный код), поэтому вы можете просто сделать:
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
,