安全读取查询字符串参数的最佳方法?

时间:2008-09-24 15:57:33

标签: javascript security parameters

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

例如,网址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的反交叉脚本库来检查参数。但是,我们需要使用JavaScript,并且不能使用任何第三方JavaScript工具(例如jQuery或Prototype)。

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

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

有人对我们有任何建议吗?

非常感谢你的时间。

5 个答案:

答案 0 :(得分:7)

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

至于转向&lt;进入&amp; lt;,这不足以确保在不允许脚本运行的情况下将内容安全地注入HTML。请确保您逃避以下&lt ;,&gt;,&amp;和“。

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

答案 1 :(得分:4)

我猜想使用白名单方法会更好。 避免只剥离“坏”的东西。除了你认为“安全”的东西之外,除去任何东西。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你应该做的几件事:

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

答案 4 :(得分:0)

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

将charset限制为只有ASCII值会有所帮助,并遵循上面的所有建议(白名单,通过DOM设置src等)