关于csrf
CSRF全称Cross Site Request Forgery,即跨站点请求伪造。
我们需要关注两点:一个是跨站点,一个是"伪造"
csrf应该是这样的:受害者正在打开某网站>攻击者欺骗或者诱导受害者访问攻击者自己的网站>受害者访问一个攻击者站点>攻击网站会自动发送http请求给受攻击的站点>因为受攻击站点保存了受害人登录的状态,导致服务器以为是受害者自己在操作
下面是从乌云里拿到的图,大概流程就是这样:
CSRF攻击方式有两种:一种是HTML CSRF攻击,一种是JSON HiJacking攻击
(1)HTML CSRF攻击:
即利用HTML元素发出GET请求(带src属性的HTML标签都可以跨域发起GET请求),如:
<link href="...">
<img src="...">
<iframe src="...">
<meta http-equiv="refresh" content="0;url=...">
<script src="...">
<video src="...">
<audio src="...">
<a href="...">
<table background="...">
(2)JSON HiJacking攻击
对于防御csrf,一般有
- 添加验证码
- 使用一次性token
- 验证Referer
- 限制Session生命周期
- 临时Cookie
而使用验证码会影响用户体验,使用一次性token会因为随机性不够好或通过各种方式泄露,验证Referer有时候回因为有些请求不带Referer
而临时Cookie原理与token差不多:当表单提交时,用JavaScript在本域添加一个临时的Cookie字段,并将过期时间设为1秒之后在提交,服务端校验有这个字段即放行,没有则认为是CSRF攻击。