CSRF (Cross Site Qequest Forgery)–跨站点请求伪造
CSRF工作原理
CSFR的特点:
攻击一般发起在第三方网站,而不是被攻击的网站,被攻击的网站无法防止攻击发生(但是可以防御csrf)。
攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作,而不是直接窃取数据。整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。(攻击者只能利用cookie而不能获取cookie)
CSRF攻击方式
1、通过图片的img src属性,自动加载,发起GET请求
<img
src="http://xxxxx.com/bank/tansfer.php?nameid=2002&amount=1000"width="0"height="0">
2、构建一个超链接,用户点击以后,发起GET请求
<a
herf="http://xxxxxx.com/tansfer.php?amount=1000&to=jiangang"taget="blank">
小姐姐在线视频聊天!!
<a/>
3、构建一个隐藏表单,用户访问,自动提交,发起POST请求
**漏洞防御**: 1、**访问控制安全管理:**(1)、敏感信息的修改需要对身份证进行二次验证,比如修改账号时,需要判断旧密码;
(2)、敏感信息的修改使用post,而不是get;
(3)、通过http头部中的referer来限制原页面
2、增加验证码:
一般用在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)
referer验证
3、Anit CSRF Token
在form表单后头信息中专递token
token存储在服务端
服务端通过拦截器验证有效性
检验失败的拒绝请求
(1)、使用用户名密码登录,服务端下发一个随机的token字段,并且服务端把这个字段保存在session中。(服务端生成token发给客户端)
session_start();
if(empty($_SESSION['token'])){
$SESSION['token']=bin2hex(random_betes(32));
}
$token= $_SESSION['token']
(2)、客户端把这个token保存起来,放到隐藏字段
(3)、用户在登录状态下,在访问的时候,都要携带这个token字段
(4)、服务器端从session中拿出token值进行对比,如果一致,说明合法
if (!empty($_POST['token'])){
if(hash_equals($_SESSION['token'],$_POST['token'])){
//执行业务逻辑
}else{
//..
}
}
(5)、用户退出,session销毁,token失效