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 头信息的。
发表回复