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

Javascript 安全读取查询字符串参数的最佳方法?,javascript,security,parameters,Javascript,Security,Parameters,我们有一个项目,它生成一个代码片段,可以用于其他各种项目。代码的目的是从查询字符串中读取两个参数,并将它们分配给iframe的“src”属性 例如,URL处的页面将包含JavaScript,用于读取“a”和“b”参数。然后JavaScript将基于这些参数设置iframe的“src”属性。例如,“” 我们目前正在使用服务器端代码执行此操作,该代码使用Microsoft的反交叉脚本库来检查参数。然而,一个新的需求已经提出,我们需要使用JavaScript,并且它不能使用任何第三方JavaScrip

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

例如,URL处的页面将包含JavaScript,用于读取“a”和“b”参数。然后JavaScript将基于这些参数设置iframe的“src”属性。例如,“”

我们目前正在使用服务器端代码执行此操作,该代码使用Microsoft的反交叉脚本库来检查参数。然而,一个新的需求已经提出,我们需要使用JavaScript,并且它不能使用任何第三方JavaScript工具(例如jQuery或Prototype)


我知道的一种方法是使用白名单方法替换“的任何实例,我想这样会更好。 避免只剥掉“坏”的东西。剥掉任何你认为“安全”的东西以外的东西


另外,我强烈建议对参数进行HTML编码。应该有很多Javascript函数可以实现这一点。

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

您应该做以下几件事:

  • 严格按照类型、格式、范围等列出您接受的值
  • 如果您的白名单不能非常紧密,则显式地将某些字符列入黑名单(即使这通常是可以绕过的)
  • 在输出之前对值进行编码,如果您使用的是反XSS,那么您已经知道仅使用一个简单的HtmlEncode是不够的
  • 通过DOM而不是通过生成HTML片段来设置src属性
  • 仅将动态值用作querystring参数,而不用于任意站点;例如,硬编码服务器名称、目标页面等
  • 您的站点是否通过SSL?如果是,使用框架可能会导致与SSL UI不一致
  • 一般使用命名帧,允许帧欺骗;如果在安全站点上,这可能是相关的攻击向量(用于钓鱼等)
不要使用escape和unescape,请使用decodeURIComponent。 例如

函数查询参数(查询){
var keyValuePairs=query.split(/[&?]/g);
var params={};
对于(变量i=0,n=keyValuePairs.length;i
并传入document.location.search

至于将<转换为,这还不足以确保在不允许脚本运行的情况下将内容安全地注入HTML


它不能保证参数没有被伪造。如果需要验证某台服务器是否生成了URL,请对URL签名进行搜索。

您可以使用正则表达式验证是否有一个p后跟9个整数,以及是否有15个字母数字值。我想我桌上的那本关于RegEx的书有一些JavaScript的例子可以帮助你


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

您应该准确定义应接受的数据,例如参数是整数、浮点数、字符串、电子邮件地址还是仅大写的产品代码?然后定义只与允许的数据匹配的正则表达式。这是一个很好的观点。其中一个参数始终为“P”,后跟9个整数,另一个参数始终为15个字母数字字符。
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;
}