0

文字列があり、文字列を使用して新しいスクリプトを作成しているため、javascript スニペットがセキュリティ リスクになるため、文字列に正規表現のみが含まれ、javascript が含まれていないことを確認する必要があります。

正確なシナリオ:

  1. Mozilla アドオンの JS は、HTTPrequest を介して json として構成をロードします (json には {"something": "^(?:http|https)://(?:.*)"} が含まれます)
  2. JS は、構成から「何か」の正規表現を使用する pac ファイル (プロキシ構成スクリプト) を作成します。

正規表現を破壊せずに文字列をエスケープする方法はありますか?

4

2 に答える 2

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にはありません。セキュリティを保持するために正しく機能する必要がある唯一の部分はctorExpressionJSON.stringify.

于 2014-08-28T18:02:47.543 に答える