2014-08-28 4 views
0

У меня есть строка, и мне нужно убедиться, что она содержит только регулярное выражение и не имеет javascript, потому что я создаю новый скрипт со строкой, поэтому фрагмент javascript будет риск безопасности.Проверьте, содержит ли строка regex & no js

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

  1. JS в MOZILLA конфигурации аддон нагрузки как JSON через HTTPRequest (JSON содержит { "что-то": "^ (?: HTTP | HTTPS): // (*)?". }
  2. JS создает пак файл (конфигурация прокси скрипт), который использует «что-то» регулярное выражение из конфигурации

Любые идеи, как избежать строки, не разрушая регулярное выражение в нем?

+0

Регулярные регулярные выражения. Я сомневаюсь, что можно будет правильно сопоставить регулярное выражение с регулярным выражением. –

+0

Итак, строка считывается/преобразуется из файла? Это означает, что вы не можете отделять конструкторы регулярных выражений от всего остального. – sln

+0

Как указано выше, строка взята из json-файла, загруженного через httprequest. Но из-за проблем безопасности с Mozilla (имеет смысл и для меня), мне нужно убедиться, что строка действительно содержит регулярное выражение и ничего больше. Если он будет содержать javascript вместо регулярного выражения, js будет выполняться в файле pac. –

ответ

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')/ регулярного выражения и выполнить ничего.

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.

Смежные вопросы