若转载教程,请注明出自SW-X框架官方文档
CSRF攻击的中文概念是叫跨站攻击,跟SQL注入、XSS攻击一样,存在巨大的危害性。
CSRF攻击攻击原理及过程如下:

  1. 1. 用户C打开浏览器,访问网站A,输入用户名和密码请求登录网站A
  2. 2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A,例如提现、充值、转账等;
  3. 3. 用户未退出网站A之前,在同一浏览器中,打开一个新的标签页访问网站B
  4. 4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点网站A
  5. 5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,
  6. 向网站A发出请求。网站A并不知道该请求其实是由B发起的,
  7. 所以会根据用户CCookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

简单的总结,CSRF攻击的原理就是,当用户C在网站A中登录之后,不小心打开了网站B,这时候带有攻击性的网站B就会抓取到浏览器中带有用户C登录信息的Cookie资料,去向网站A模拟请求,非法操作提现、充值、转账等功能。

A、真正的CSRF案例

CSRF攻击实例:
受害者A在银行有一笔存款,通过对银行的网站发送请求http://127.0.0.1/?user=A&amount=10000&name=B 可以使 A 把 10000 的存款转到 B 的账号下。
通常情况下,该请求发送到银行网站后,服务器会先验证该请求是否来自一个合法的 Session,并且该 Session 的用户 A 必须已经成功登陆,才能成功转账给用户 B。
这时候黑客 COCO 自己在该银行也有账户,他知道可以通过URL把钱进行转帐操作。
COCO 可以自己发送一个请求给银行:http://127.0.0.1/?user=A&amount=10000&for=COCO。但是这个请求来自 COCO 的账号 而非 用户 A,他不能通过安全认证,因此该请求不会起作用,是个非法请求。
这时,COCO 想到使用 CSRF 的攻击方式,他先自己开发出一个钓鱼网站,
在网站中放入如下代码: src=”http://127.0.0.1/?user=A&amount=10000&for=COCO”,并且通过广告等诱使 用户A 来访问他的网站。
当 用户A 访问该网站时,上述 url 就会从 用户A 的浏览器发向银行,而这个请求会附带 用户A 浏览器中的 cookie 一起发向银行服务器。
大多数情况下,该请求会失败,因为他要求存在 用户A 的登录认证信息。
但是,如果 用户A 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 用户A 的认证信息。
这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 用户A 的账号转移到 COCO 的账号,而 用户A 当时毫不知情。
等以后 用户A 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。
而 COCO 则可以拿到钱后逍遥法外。

B、如何正确的防御CSRF攻击

首先,我们需要先了解CSRF的攻击原理是什么,实际上说错了,CSRF就是需要抓取用户A在浏览器暂存的登录信息,然后伪造提交。
而提交始终是需要经过POST或者GET请求,这时候如果我们能够再每一次请求之前,都生成一段随机数保存在请求中,然后用作唯一请求,然后请求通过之后就会将其清空或者重置,这样是不是就可以有效的防御CSRF攻击了呢?
这样就算网站B抓取到了用户A在网站A中的登录信息,也没办法抓取到这段随机数,所以不管它怎么发起CSRF攻击,都将无效。