CSRF 全称是 Cross-Site Request Forgery,指攻击者盗用了用户的身份,以用户的身份发送恶意请求。
CSRF 攻击流程
- User 登录网站 A(存在 CSRF 攻击漏洞的网站)
- User 在没有网站 A 的情况下,使用同一个浏览器访问危险网站 B
- 网站 B 模拟 User,发送恶意的 GET 或者 POST 请求(通过 iframe、js 等)到网站 A。比如让网站 A 删除用户数据
- 网站 A 在没有防范的情况下,破坏或者泄露了用户数据
网站 A 防范 CSRF 攻击的简单方式是在用户提交表单时,增加一个令牌验证。
令牌验证
在网站 A 增加简单令牌
<?php function gen_csrf_token() { session_start(); return md5(session_id()); } function verify_csrf_token($token) { session_start(); return $token = md5(session_id()); } ?> <form action="/user/update" method="post"> <input name="csrf_token" value="<?=gen_csrf_token()?>"/> <input name="sex" value="man"/> <input type="submit"/> </form>
当表单提交时,执行 verify_csrf_token 判断是否令牌是否正确,继而认为不是第三方网站伪造的请求。
HTTP_REFERER 验证
验证 http_referer 也能够从一定程度上降低 CSRF 攻击风险。现代浏览器是不允许修改 HTTP_REFERER 头信息的。