CSRF攻击和防御

CSRF的全称是Cross Site Request Forgery,即跨请求伪造。CSRF对于那些开源网站、多用户网站、社交网站非常值得关注。

  • 跨站点的请求
  • 请求是伪造的

get攻击

  • 跨域发出一个get请求
  • 无javascript参与
  • 请求是身份认证之后

Cookies是共享的。它可以在不同的页面发送带上Cookies请求,所以不安全。IE浏览器默认不允许目标网站的Cookie在这样的跨域请求中带上,除非在HTTP响应头设置了PSP,但对于非IE的浏览器没有这样的限制。

post攻击

通过javascript动态生成的form提交post请求。

嵌入的第三方资源都是可以发出跨域的get请求。

  • JSONP
  • 图片
  • CSS样式
  • 框架内容

CSRF的分类

  • HTML CSRF攻击
    发起跨站请求都是属于HTML元素发出的,这一类是最普遍的CSRF攻击。

注意:HTML中能够设置src/href等链接地址的标签都可以发起一个GET请求。

<link href="" />
<img src="" />
<img lowsrc="" />
<img dynsrc="" />
<meta htt-equiv="refresh" content="0; url=" />
<iframe src="" />
<script src="" />
<bgsound src="" />
<embed src="" />
<vedio src="" />
<audio src="" />
<a herf="" />
<table background="" />
...

css样式中:

@import ""
background:url("")
...
  • JSON CSRF攻击

原理跟JSONP差不多。不过是不同域名发出的跨站get请求

  • Flash CSRF攻击

  • 跨域获取私密数据

  • 跨域提交数据操作,一些如添加、删除、编辑等操作的请求,这里并不会获取到私密数据。

如何方法

  1. 判断Referer
  2. 使用Token判断,用户登录时根据用户名和密码等加密生成一个Token值,同时写入到浏览器的Cookie和Hidden中,然后根据每次的请求将Token和Cookie同时带入到服务端进行验证和判断。

推荐阅读更多精彩内容