一、CSRF简介
CSRF(Cross-site request forgery跨站请求伪造),也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
CSRF是一种依赖web浏览器的、被混淆过的代理人攻击(deputy attack)。
CSRF与之前说道XSS相比,出现比较少,流行度也不高,但是一旦出现,就是危害巨大的,难于防御(因为影响业务和用户体验)。CSRF攻击的本质是攻击者盗用合法用户的身份性,以用户的名义进行非法操作。
二、CSRF进阶
浏览器所持有的Cookie分为两种:一种是“Sesion Cookie”,又称“临时Cookie”;另一种是“Third-party Cookie”,也称为“本地cookie”。两者的区别在于,Third-party Cookie是服务器在Set-Cookie时指定Expire时间,只是到了Expire时间后Cookie才会失效,所以这种Cookie才会保存在本地;Session Cookie则没有指定Expire时间,所以关闭浏览器,Session Cookie就会失效。
在浏览网站的过程中,若是一个网站设置了Session Cookie,那么在浏览器的进程的生命周期内,及时浏览器心打开一个Tab页面,Session Cookie也是有效的,Session Cookie保存在浏览器进程的内存空间中。CSRF攻击就是建立在会话之上的。
总结一下,CSRF攻击需要两个条件:
1、CSRF攻击建立在浏览器与服务器的会话中;
2、欺骗用户访问攻击URL;
浏览器也会有一些安全策略防御,IE处于安全的考虑,默认禁止了浏览器在<img>,<iframe>,<scrtpt>,<link>等标签中发送第三方Cookie。而Firefox中,默认策略是允许发送第三方Cookie的。
P3P
P3P是一种被称为个人隐私安全平台项目(the Platform for Privacy Preferences)的标准,能够保护在线隐私权,使Internet冲浪者可以选择在浏览网页时,是否被第三方收集并利用自己的个人信息。如果一个站点不遵守P3P标准的话,那么有关它的Cookies将被自动拒绝,并且P3P还能够自动识破多种Cookies的嵌入方式。p3p是由全球资讯联盟网所开发的。
随着Internet的发展,电子商务发展势头也异常迅猛。这种新的贸易方式在带给人们难以想象的便利前提下,也给人们带来了以往现金交易模式下所没有的麻烦——通过网络泄露个人隐私数据。(Platform for Privacy Preferences)正是一种可以提供这种个人隐私保护策略,并且正在被越来越多的技术人员接受的新技术。
Java实现:在Response的响应头中加入
response.setHeader("P3P","CP=/"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR/"");
请注意不要滥用该P3P属性,以免带来安全隐患。
CSRF攻击成功的本质原因是重要操作的所有参数都是可以被攻击者猜测到了。
三、CSRF的防御
3.1 验证码
验证码是认为对抗CSRF攻击最简洁而有效的防御方法。但是考虑到用户的体验效果,最好是在重要的操作再使用验证码。所以在支付的时候都可以看到再一次输入密码或者验证码的要求。
3.2 混淆参数
CSRF攻击多是通过构造URL进行攻击的,所以可以在URL请求中加入一些随机数或者混淆。
http://www.XXXXXX.com/XXXXX.php?url=rHfK000YH1eRCqsWBVUDjjv3ru5QictGyTrai04fZHnNCmGNz8Oyoc3XLJslxxiLK4Uhf91JVGzeFUXujPJ4iZlOFZKFZGlb7bU_TZMwAiSlA9D2-f4NdEuyQYp8UVXHBw1W0WY.7Y_ifkR5QZWY8BHCwKZWHaqhWKY5BWJI64qt7jHzk8sHfGmqx-OcO3ZgKfYt8-P1tA-BZZjdsRP5QfHPGmsSxH9LqrZd_sSxH9vUtr1dsSXej_SyZx8sSXej_LmIMAz1c_HZ4xl54xPmuCyr1Wgvy0.THdxnHf1PW6vnHD1PfKYTh7buy-b5Hm4njD0mvq1I7qzmy4o5H00TLNBTy-b5HDYn1m3PWDkn1RLnWnLP10zPWb0ugw4TARqnHD0uy-b5H00uyw-TvPGujYs0AP_pyPogLw4TARqn6KsUWYk0Zw-ThdGUh7_5H00XMfqTvN_u6KsTjYkP101rHnYP1c0mywGujYznH04n161P1DsPfKGTdqLpgF-UAN1T1Ys0AN3Ijd9mvP-TLPRXgK-rhdsr1VsIh-brWDYn1m3PWDkn1RLnWnLP10zPWberv-1N-PfrW0erLKzUvwdmLwRXgK-rWnknjcerLw1Tv-brMNGc10hmMPFUMPdTh78mvRWnBuBTY-8IhN1IankFhF1HAq9UBnz0APzm1YLPjRk&ck=2818.174.177.351.22.678.292.1631
3.3 Token
请求加入Token是目前防御CSRF最好的方式,对应用的框架水平要求就高,用户的会话有效期也不宜过长。
Token防御的重点在于Token的生成、保存、校验、失效等方面。
1、Token生成:时间戳+随机数,长度16--20位即可,时间戳就是为了判断Token是否失效;
2、Token只能使用一次,而且只在重要的操作时候进行校验Token;
3、Token保存:后台:分布式缓存系统中;前端页面的标签:<meta name="CSRF_Token" content="14232454567687456486796" />;
4、通过Javascript构造安全链接URL,并带上Token;