我正在使用一些旧代码,据报道这些代码很容易受到跨站脚本攻击。代码行是
document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />");
该报告还提供了有关如何将恶意代码注入页面的以下示例。通过将cookie值更新为
fieldval='><img src=x onerror=alert(1)>
是否可以提供有关如何修复此漏洞的见解?
答案 0 :(得分:2)
您需要验证来自getCookieValue的数据。如果您期望一个数字,请确保返回的值是数字。还要确保字段中不存在任何转义字符(例如,突破javascript的引号)。解决此问题的方法如下:
function is_valid(value) {
// Do some check here depending on what you're expecting.
// I also recommend escaping any quotes (i.e. " becomes \")
// Ideally, you'd just whitelist what is acceptable input (A-Z0-9 or whatever,
// and return false from this function if something else is present in
// value!)
}
var cookie_value = getCookieValue('fieldval');
if(is_valid(cookie_value)) {
document.write('<input type="hidden name="field1" value="' + cookie_value + '" />');
}
长话短说,在document.write之前清理数据,或者最终得到一个反映的XSS。
正如上面的评论中所提到的,源自用户自己的cookie(他们自己修改的东西)的XSS并不特别令人担忧。但是,无论采用何种编码方法,都可能出现在其他地方。我建议您查看来源,并确保用户的所有输入被视为不受信任和适当消毒。
答案 1 :(得分:2)
您的代码包含两个错误:
document.write
将纯HTML插入DOM(这为DOM XSS攻击打开了大门)在重新发明轮子之前,你应该查看OWASP备忘单以纠正错误:
正如您所看到的,仅通过转义引号无法解决您的问题。将不受信任的数据列入白名单始终是首选方式和有效建议。为了进一步阅读有关XSS的内容,链接包含许多参考文献。