【问题标题】:Check if string contains a regex & no js检查字符串是否包含正则表达式 & 没有 js
【发布时间】:2014-08-28 15:33:42
【问题描述】:

我有一个字符串,我需要确保它只包含一个正则表达式而不包含 javascript,因为我正在使用该字符串创建一个新脚本,因此 javascript sn-p 会带来安全风险。

具体场景:

  1. mozilla 插件中的 JS 通过 HTTPrequest 将配置加载为 json (json contains {"something": "^(?:http|https)://(?:.*)"}
  2. JS 创建一个 pac 文件(代理配置脚本),它使用配置中的“某事”正则表达式

任何想法如何在不破坏其中的正则表达式的情况下转义字符串?

【问题讨论】:

  • 正则表达式不规则。我怀疑是否有可能准确地将正则表达式与正则表达式匹配。
  • 那么,字符串是从文件中读取/转换的吗?这意味着你不能将正则表达式结构与其他任何东西分开。
  • 如上所述,字符串来自通过 httprequest 加载的 json 文件。但是由于 Mozilla 的安全问题(对我来说也很有意义),我需要确保字符串确实包含正则表达式,而没有其他内容。如果它包含 javascript 而不是正则表达式,则 js 将在 pac 文件中执行。
  • 那么首先是字符串还是 json 文件? JS 何时以及如何执行?
  • json文件是字符串的来源!可以执行 JS,因为我在脚本中使用字符串生成了一个新的 pac-script(代理配置)。

标签: javascript regex pac


【解决方案1】:

似乎大部分标准 JavaScript 功能都可用 (source),所以你可以这样做:

try {
    RegExp(json.something+'');
    pacFile += 'RegExp(' + JSON.stringify(json.something+'') + ')';
} catch(e) {/*handle invalid regexp*/}

不用担心,因为RegExp("console.log('test')") 只会产生一个有效的/console.log('test')/ 正则表达式并且什么都不执行。

【讨论】:

    【解决方案2】:

    您可以使用正则表达式来拆分 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多