一、CSRF
CSRF的全名是Cross Site Request Forgery,即跨站点请求伪站。
1、浏览器的cookie策略
很多***者伪造的请求之所以能在在服务器验证通过,是因为用户的浏览器成功发送了cookie的缘故。
浏览器所持有的cookie分为两种:一种是"Session 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保存在浏览器进程的内存空间中,而Third-party Cookie则保存在本地。
如果浏览器从一个域的页面中,要加载另一个域的资源,由于安全原因,某些浏览器会阻止Third-party Cookie的发送。
下面这个例子,演示了这一个过程:
在http://www.a.com/cookie.php中,会给浏览器写入两个Cookie:一个是Session Cookie,另一位Third-party Cookie。
<?php header("Set-Cookie: cookie1=123;"); header("Set-Cookie: cookie2=456;expires=Thu,01-Jan-2030 00:00:01 GMT;",false); ?> |
访问这个页面,发现浏览器同时接收(Direction:Recived 第一次接收)了这两个Cookie。
这时再打开一个新的浏览器Tab页,访问同一个域中的不同页面。因为新Tab页在同一个浏览器进程中,因此Session Cookie将被发送(Direction:Sent 第二次发送到服务器端)。
此时在另外一个域中,有一个页面http://www.b.com/csrf-test.html,此页面构造了CSRF以访问www.a.com。
<iframe src="http://www.a.com" > </iframe> |
这时却发现,只能发送Session Cookie(Cookie:123),而Third-party Cookie被禁止了。
这是因为IE因为安全考虑,禁止了浏览器在<img>、<iframe>、<script>、<link>等标签中发送第三方Cookie。但是firefox是允许发送第三方Cookie的。
在当前的主流浏览器中,默认会拦截Third-party Cookie的有:IE、Safari;不会拦截的有:Firefox、Opera、Chrome、Android等。
2、P3P头的副作用
P3P Header是W3C制定的一项隐私的标准,全称是The Platform for Privacy Preferences。
如果网站返回给浏览器的HTTP头里包含P3P头,则在某种程度上说,将允许浏览器发送第三方Cookie,即使是在IE浏览器中。
3、CSRF的防御
3.1 验证码
验证码被认为是对抗CSRF***最简洁有效的防御方法,它强制用户必须与应用交互,才能完成最终请求,但是验证码也非万能的,出于用户体验考虑,不可能所有请求都需要用户输入验证码。
3.2 Referer Check
Referer最常见的应用就是防止图片盗链,同理,Referer Check也可以被用于检查请求是否来自合法的"源"
Referer Check的缺陷在于,服务器并非什么时候都能取到Referer。很多隐私条件下,限制了Referer的发送。
3.3 Anti CSRF Token
现在业界一直的防御方式是使用Token。
CSRF为什么能***成功,起本质原因是重要的所有参数都是可以被***猜测到的。***者只有预测出URL的所有参数和参数值,才能成功的构造一个伪站的请求;反之,***者无法***成功。
二、点击劫持(ClickJacking)
点击劫持是一种视觉上的欺骗手段。***者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后又是用户在该网页上操作。
常见的形式有:Flash点击劫持、图片覆盖***、拖拽劫持与数据窃取、触屏劫持
防御方式:
1、frame bustiong
通常可以写一段JavaScript代码,以禁止iframe嵌套。这种方法叫frame bustiing。
2、X-Frame-Options
X-Frame-Option可以说是为了解决ClickJacking而生的,它有三个可选值:
DENY:浏览器会拒绝当前页面加载任何frame页面;
SAMEORIGIN:frame页面的地址只能为同源域名下的页面;
ALLOW-FROM origin:定义允许加载的页面地址。
除了X-Frame-Options之外,Firefox的"Content Security Policy"以及Firefox的NoScript扩展也能够防御ClickJacking。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。