document.write的跨站点脚本问题

时间:2013-02-07 18:53:31

标签: javascript xss

我正在使用一些旧代码,据报道这些代码很容易受到跨站脚本攻击。代码行是

document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />");

该报告还提供了有关如何将恶意代码注入页面的以下示例。通过将cookie值更新为

fieldval='><img src=x onerror=alert(1)>

是否可以提供有关如何修复此漏洞的见解?

2 个答案:

答案 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)

您的代码包含两个错误:

  1. 您将不受信任的数据插入到输出中而不对其进行正确编码(这为反映的XSS攻击打开了大门)
  2. 您使用document.write将纯HTML插入DOM(这为DOM XSS攻击打开了大门)
  3. 在重新发明轮子之前,你应该查看OWASP备忘单以纠正错误:

    1. OWASP XSS Prevention Cheak Sheet - Rule 2
    2. OWASP DOM based XSS Prevention Cheat Sheet - Rule 2
    3. 正如您所看到的,仅通过转义引号无法解决您的问题。将不受信任的数据列入白名单始终是首选方式和有效建议。为了进一步阅读有关XSS的内容,链接包含许多参考文献。