【问题标题】:Best way to safely read query string parameters?安全读取查询字符串参数的最佳方法?
【发布时间】:2008-09-24 15:57:33
【问题描述】:

我们有一个项目可以生成可以用于其他各种项目的代码 sn-p。该代码的目的是从查询字符串中读取两个参数并将它们分配给 iframe 的“src”属性。

例如,URL http://oursite/Page.aspx?a=1&b=2 处的页面将包含用于读取“a”和“b”参数的 JavaScript。然后,JavaScript 将根据这些参数设置 iframe 的“src”属性。例如,“

我们目前正在使用 Microsoft 的 Anti Cross-Scripting 库检查参数的服务器端代码执行此操作。然而,一个新的要求来了,我们需要使用 JavaScript,并且不能使用任何第三方 JavaScript 工具(例如 jQuery 或 Prototype)。

我知道的一种方法是在使用参数之前替换参数中的任何“

其中一个参数始终是一个“P”,后跟 9 个整数。 另一个参数始终是 15 个字母数字字符。 (感谢 Liam 建议我说清楚)。

有人对我们有什么建议吗?

非常感谢您的宝贵时间。

【问题讨论】:

    标签: javascript security parameters


    【解决方案1】:

    不要使用escape和unescape,使用decodeURIComponent。 例如。

    function queryParameters(query) {
      var keyValuePairs = query.split(/[&?]/g);
      var params = {};
      for (var i = 0, n = keyValuePairs.length; i < n; ++i) {
        var m = keyValuePairs[i].match(/^([^=]+)(?:=([\s\S]*))?/);
        if (m) {
          var key = decodeURIComponent(m[1]);
          (params[key] || (params[key] = [])).push(decodeURIComponent(m[2]));
        }
      }
      return params;
    }
    

    并传入 document.location.search。

    就将 、& 和 ".

    进行转义

    不保证参数没有被欺骗。如果您需要验证您的某个服务器是否生成了 URL,请搜索 URL 签名。

    【讨论】:

      【解决方案2】:

      我想使用白名单方法会更好。 避免只删除“坏”的东西。去掉任何你认为“安全”的东西。

      我也强烈建议对参数进行 HTMLEncode。应该有很多 Javascript 函数可以做到这一点。

      【讨论】:

      • 您应该准确定义哪些数据应该是可接受的,例如参数 a 是整数、浮点数、字符串、电子邮件地址还是仅大写的产品代码?然后定义只匹配允许的数据的正则表达式。
      • 这很好。其中一个参数始终是“P”后跟 9 个整数,另一个参数始终是 15 个字母数字字符。
      【解决方案3】:

      您可以使用 javascript 的 escape() 和 unescape() 函数。

      【讨论】:

        【解决方案4】:

        你应该做的几件事:

        • 根据类型、格式、范围等,将您接受的值严格列入白名单
        • 如果您的白名单不能非常严格,则将某些字符明确列入黑名单(即使这通常可以绕过)。
        • 在输出之前对值进行编码,如果您使用的是 Anti-XSS,您已经知道简单的 HtmlEncode 是不够的
        • 通过 DOM 设置 src 属性 - 而 不是 通过生成 HTML 片段
        • 使用动态值作为查询字符串参数,不能用于任意站点;即硬编码服务器名称、目标页面等。
        • 您的网站是否使用 SSL?如果是这样,使用框架可能会导致与 SSL UI 不一致...
        • 一般使用命名帧,可以允许帧欺骗;如果在安全站点上,这可能是相关的攻击媒介(用于网络钓鱼等)

        【讨论】:

          【解决方案5】:

          您可以使用正则表达式来验证您有一个 P 后跟 9 个整数以及您有 15 个字母数字值。我认为我在 RegEx 办公桌上的那本书有一些 JavaScript 示例可以帮助你。

          将字符集限制为仅 ASCII 值会有所帮助,并遵循上述所有建议(白名单、通过 DOM 设置 src 等)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-15
            • 2011-11-21
            • 2012-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多