我们有一个项目可以生成可用于其他各种项目的代码段。代码的目的是从查询字符串中读取两个参数,并将它们分配给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建议我说清楚。)
有人对我们有任何建议吗?
非常感谢你的时间。
答案 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)
你应该做的几件事:
答案 4 :(得分:0)
您可以使用正则表达式来验证您有一个P后跟9个整数,并且您有15个字母数字值。我认为我在RegEx桌面上的那本书中有一些用JavaScript帮助你的例子。
将charset限制为只有ASCII值会有所帮助,并遵循上面的所有建议(白名单,通过DOM设置src等)