Проверьте, содержит ли строка регулярное выражение и нет js

У меня есть строка, и мне нужно убедиться, что она содержит только регулярное выражение и не содержит JavaScript, потому что я создаю новый сценарий со строкой, чтобы фрагмент кода JavaScript был угрозой безопасности.

Точный сценарий:

  1. JS в аддоне Mozilla загружает конфигурацию как json через HTTPrequest (json содержит {"что-то": "^(?: Http | https): // (?:. *)"}
  2. 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,

Другие вопросы по тегам