更多文章欢迎关注微信公众号 前端阅读室
简介
CSRF(Cross Site Request Forgery),翻译成中文就是跨站点请求伪造。
攻击者首先在自己的域构造一个页面
http://www.a.com/csrf.html
其内容为
<img src="http://blog.com/article?m=delete&id=1" />
诱使目标用户访问这个页面,用户看到了一张无法显示的照片,但是回头再看博客id=1的文章已经被删除了。这是以该用户身份(发送了Cookie)在第三方站点里执行了一次操作,这个请求是攻击者伪造的,所以叫“跨站点请求伪造”。
浏览器的Cookie策略
浏览器所持有的Cookie分为两种:一种是“Session Cookie”,又称“临时Cookie”;另一种是“Third-party Cookie”,也称为“本地Cookie”。Third-party Cookie服务器指定了Expire时间。Session Cookie没有指定过期时间,新打开的Tab页也是有效的,但浏览器关闭后就失效了。
一个域加载另一个域的资源,由于安全原因,许多浏览器会阻止Third-party Cookie的发送,只能发送Session Cookie。删除文章的例子是在不会阻止Third-party Cookie发送的浏览器中实现的。
P3P头的副作用
浏览器拦截第三方Cookie发送,在某种程度上降低了CSRF攻击的威力。
但是P3P Header会是问题复杂起来,它是W3C制定的一项关于隐私的标准,如果网站返回给浏览器的HTTP头中包含有P3P头,将允许浏览器发送第三方Cookie。它重要用于需要跨域访问页面的场景,如父页面b嵌入了iframe,iframe的src指向的a页面网址,a页面响应头有Set-Cookie。一般情况下由于跨域,在a.com上Set-Cookie是不会成功的,但是加入P3P头后,可以跨域Set-Cookie成功,浏览器也不会再拦截第三方Cookie的发送。P3P头只需要由网站设置一次即可,之后每次请求都会遵循此策略。
只可以发送GET请求吗?
其实对于攻击者来说,也可以有许多方法构造POST请求。
最简单的方法比如在页面中构造一个form表单,使用JavaScript自动提交这个表单。
Flash CSRF
Flash CSRF也有多种方式能够发送网络请求,包括POST请求。除了使用URLRequest外,还可以使用getURL、loadVars等。在IE6、IE7中,Flash发送的网络请求均可以带上本地Cookie。
CSRF Worm
2008年9月,公布了一个百度的CSRF Worm。
http://msg.baidu.com/?...sn=用户账户&co=消息内容...
修改参数sn,可以对指定用户发送短消息。
而另一个接口能查询出某个用户的所有好友
http://frd.baidu.com/?...un=用户账户...
两者相结合,让一个百度用户查看恶意页面后,给他所有好友发送一条短消息,消息中又包含一个恶意页面,使得好友将消息发送给他们的好友,就可以形成一个CSRF Worm。