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

时间:2020-03-06 14:40:18  来源:igfitidea点击:

我们有一个项目,该项目会生成可在其他各种项目上使用的代码段。该代码的目的是从查询字符串中读取两个参数,并将它们分配给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个字母数字字符。
(感谢利亚姆建议我说清楚)。

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

非常感谢宝贵时间。

解决方案

我想使用白名单方法会更好。
避免只去除"坏"的东西。除去我们认为"安全"的内容以外的任何内容。

另外,我强烈建议我们对参数进行HTMLEncode。应该有很多可以执行此操作的Javascript函数。

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

我们应该做的几件事:

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

不要使用转义和不转义,请使用解码URIComponent。
例如。

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签名进行搜索。

我们可以使用正则表达式来验证我们是否有一个P,后跟9个整数,并且我们有15个字母数字值。我认为我在RegEx的办公桌上的书中有一些JavaScript示例可以。

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