Javascript document.write存在跨站点脚本问题

Javascript document.write存在跨站点脚本问题,javascript,xss,Javascript,Xss,我正在使用一些旧代码,据报道这些代码易受跨站点脚本攻击。代码行是 document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />"); document.write(“”); 该报告还提供了以下示例,说明如何将恶意代码注入页面。通过将cookie值更新为 fieldval='><img src=x onerror=alert(1)> fie

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

document.write("<input type=hidden name=field1 value='" + getCookieValue('fieldval') + "' />");
document.write(“”);
该报告还提供了以下示例,说明如何将恶意代码注入页面。通过将cookie值更新为

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

有人能提供有关如何修复此漏洞的见解吗?

您需要验证来自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 + '" />');
}
函数有效(值){
//根据你的期望在这里做一些检查。
//我还建议转义任何引号(即“变成”)
//理想情况下,您只需将可接受的输入(A-Z0-9或其他内容)列入白名单,
//如果此函数中存在其他内容,则返回false
//价值!)
}
var cookie_value=getCookieValue('fieldval');
if(是否有效(cookie值)){

document.write(“您的代码包含两个错误:

  • 您将不受信任的数据插入到输出中而没有正确编码(这为反射的XSS攻击打开了大门)
  • 您可以使用
    document.write
    将普通HTML插入DOM(这为DOM XSS攻击打开了大门)
  • 在重新发明轮子之前,您应该查看OWASP备忘单以纠正错误:


  • 正如您所见,仅转义引号并不能解决您的问题。将不受信任的数据列入白名单始终是首选方法,也是一个有效的建议。为了进一步了解XSS,通常链接包含许多引用。

    不确定这是否是问题所在,但您需要转义引号和双引号。有人会如何注入恶意“将代码写入您的Cookie?当然,转义也不错。@Bergi我想用户只是在浏览器中编辑了Cookie。不过,我不确定这会对其他用户产生什么影响,所以我认为这不会在总体方案中造成太多问题。然而,无论是何种编码实践导致了这种XSS,其他地方也可能存在。”。@路易斯:每个用户都可以在自己的计算机上执行恶意代码。因此,只要一个人不能影响发送给其他用户的cookies,这就不是安全问题。@Bergi正确,我也指出了很多。但是,导致此问题的不良做法可能存在于代码的其他部分。可能会影响其他用户的部分。我将尝试这个,然后回复。谢谢你的回答