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

taut 发布于 2018-05-07 javascript 最后更新 2018-05-07 15:32 193 浏览

我们有一个项目可以生成可用于各种其他项目的代码片段。代码的目的是从查询字符串中读取两个参数,并将它们分配给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个字母数字字符。 (感谢Liam建议我明确说明)。 有人对我们有什么建议吗? 非常感谢您的宝贵时间。

已邀请:

tqui

赞同来自:

我猜想使用白名单方法会更好。 避免只剥去“坏”的东西。剥离除您认为“安全”以外的任何内容。 此外,我强烈鼓励做一个HTMLEncode的参数。应该有大量的JavaScript函数可以做到这一点。

quo_et

赞同来自:

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

daut

赞同来自:

你应该做的几件事情:

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

punde

赞同来自:

不要使用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。 就转动< into& lt ;,这不足以确保内容可以安全地注入HTML而不允许脚本运行。确保您逃避以下&,;,&,和“。 它不能保证参数不被欺骗。如果您需要验证其中一台服务器生成了该网址,请在网址签名上进行搜索。

dsit

赞同来自:

您可以使用正则表达式来验证您是否有P后跟9个整数,并且您有15个字母数字值。我认为我在RegEx桌面上出现的这本书有一些JavaScript例子可以帮助你。 将字符集限制为只有ASCII值会有帮助,并遵循上面的所有建议(白名单,通过DOM设置src等)