一、概念
CRSF(Cross-site-request-forgery)是跨站请求伪造。顾名思义就是伪造他人的身份去发送请求。
二、特点
- CRSF 攻击需要取得他人身份(cookie 信息)。
- CRSF 攻击是利用网站对身份的信任。
- CRSF 攻击是利用他人的浏览器发送请求给目标站点。
三、示例
故事:老王经过登录之后浏览 A 网站,A 网站就保留着老王的 cookie 信息,这时候老王在 A 网站看到一个链接,出于好奇心,老王点了进去,访问了 B 网站,殊不知,B 网站是黑客小黑留下的带有恶意请求的站点。过了会儿,老王收到短信,您的个人账户已扣款100万,老王吓得跳了起来,这是怎么回事?
分析:代码实现以上攻击过程。
- 老王在浏览器中输入用户名和密码,登陆到 A 网站。
- 服务器接收到 A 网站的登陆请求后,验证用户名和密码,验证通过之后生成 session 并返回给浏览器。
- 浏览器保存 session 信息在 cookie 中。
<script>
var session = 'nvenengepnegn3r34';
//session 应该是服务器返回的,这里做一个模拟
document.cookie="session = "+session;
</script>
- 老王在浏览 A 网站时看到一个链接点了进去,进入到了 B 网站,B 网站是小黑故意留下的,其内容为
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>React App</title>
</head>
<body>
<img src="www.123.com?username=小黑&money=1000000" alt="">
</body>
</html>
-
老王点击了此链接之后就自动向服务器发送了请求,即小黑恶意制造的 B 网站向服务器发送了转账到小黑帐户的请求。
-
服务器在接收到请求时,会验证浏览器的 session 信息,因为老王刚刚才登陆过,session 还没过期,所以验证通过,于是直接响应了请求。
-
100 万成了小黑的囊中之物。
四、防范
理解了跨站请求伪造之后,应该如何防范呢?
- 开发者层面
- CRSF 最容易攻击的是 GET请求,所以尽量使用 POST 请求;
- 在请求地址中添加 token 验证;
- 验证 HTTP Referer 字段,而不是仅仅验证 session;
- 在HTTP 请求头中加入 token。
- 用户层面
- 不要随意点击未知的链接或打开未知的图片,图片的 src 属性也可以发送请求;
- 在打开其他站点前先退出登录或清掉浏览器的 cookie 信息。
五、其他
在前端领域中与 CSRF 漏洞类似的还有 XSS 漏洞,想要了解的可以参考前端安全漏洞之 XSS 、前端安全漏洞 XSS 与 CSRF 异同。