我的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操作或打开重定向。
我该如何解决这个问题?
答案 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) + ...