如何使用JavaScript修复标头操作cookie?

时间:2014-08-26 05:48:24

标签: javascript cookies fortify

我的JavaScript代码:

function CookieSetting(name, value) {
    var today = new Date();
    today.setTime( today.getTime() );
    var expires = 28;
    expires = expires * 1000 * 60 * 60 * 24;
    var expires_date = new Date( today.getTime() + (expires) );
    document.cookie = name+"="+escape( value ) +
    ( ( expires ) ?";
   domain="+window.location.hostname+";path=/;expires="+expires_date.toGMTString() : "" )
}

它工作正常,但是当我运行Fortify工具时,它显示了这个错误:

  

CookieSetting()方法包括HTTP响应头中未经验证的数据。

     

这可以实现缓存中毒跨站点脚本跨用户污损等攻击    页面劫持cookie操作或打开重定向。

     

在HTTP响应标头中包含未经验证的数据可以启用缓存中毒跨站脚本,跨用户污损,页面劫持,cookie操作或打开重定向。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是如果值来自用户输入,他可以攻击您的http标头。

如果他能够将CR(回车,也由%0d或\ r \ n给出)插入,那么他可以在你的http中添加另一个标题请求(因为http标头由CR分隔)。 来源:Nice web article about those attacks

解决方案A)

我已经调查了existing implementation of javascript setCookie,他们做的是:

optionsString = ( ( expires ) ? "; domain="+window.location.hostname+";path=/;expires="+expires_date.toGMTString() : "" 
document.cookie = cookieName + '=' + encodeURIComponent( value ) + optionsString;

但是如果你这样做,你需要相反的方法来获取cookie - getCookie(),你可以在返回值之前执行 decodeURIComponent()

我会尝试通过 encodeURIComponent()方法清理您的值。

解决方案B)

清理名称参数

你可以尝试的另一件事就是通过escape方法清理你的名字,也许这就是强化工具抱怨的原因:

document.cookie = window.escape(name)+"="+window.escape(value) + ...