安全读取查询字符串参数的最佳方法?
我们有一个项目,该项目会生成可在其他各种项目上使用的代码段。该代码的目的是从查询字符串中读取两个参数,并将它们分配给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等)