4

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

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

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

我知道的一种方法是在使用参数之前替换参数中的任何“<”、单引号和双引号,但这对我来说似乎不够安全。

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

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

非常感谢您的宝贵时间。

4

5 回答 5

8

不要使用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。

就将 < 转换为 < 而言,这不足以确保内容可以安全地注入 HTML 而不允许脚本运行。确保您转义了以下 <、>、& 和 "。

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

于 2008-09-24T17:55:18.517 回答
4

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

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

于 2008-09-24T16:00:40.137 回答
1

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

于 2008-09-24T16:05:00.717 回答
0

你应该做的几件事:

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

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

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

于 2008-09-24T17:56:27.580 回答