企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# CSRF 攻击 cross site request forgy(跨站请求伪造) # CSRF 攻击原理 ![](https://img.kancloud.cn/40/4b/404bfefdc480d2ecb8a88db564fa78bc_2498x862.png) # CSRF 攻击危害 * 利用用户登录态 * 用户不知情 * 完成业务请求 * 盗取用户资金(转账、消费) * 冒充用户发帖背锅 * 损坏网站名誉 # 攻击特征 * B网站向A网站请求 * 带A网站Cookies * 不访问A网站前端 * (http头中)referer为B网站 # 攻击防御 * “带A网站Cookie” : 禁止第三方网站带Cookies > set-cookie 的时候对`samesite`属性的设置(strict / lax / none) * “不访问A网站前端” : 在前端页面加入验证信息 > * 验证码 > 生成图形验证码:ccap 插件 (npm install ccap -S) > > * token > 后端生成一个随机串`csrf-token`,以`set-cookie`以及**页面内容**的方式发给前端(前端页面可以保存在表单的隐藏域中,也可以保存在meta域中),前端在请求体和请求头的cookie中分别发送该随机串给后端,后端验证是否一致。 * “referer 为B网站”:验证 referer,禁止来自第三方网站的请求 > node 环境 koa 框架下获取referer:ctx.request.headers.referer # PHP 防御 CSRF * Cookie 的 samesite 属性 ``` // 由于php中的 setcookie() 函数不能设置 samesite 属性,所以我们用 header() 函数 header('Set-Cookie: test=1234; SameSite=Lax'); ``` * HTTP referer 头 ``` if ( $_SERVER['HTTP_REFERER'] && strpos($_SERVER['HTTP_REFERER'], 'http://testdomain.com') === 0 ) { } ``` * token ``` if ( $_POST['csrfToken'] === $_COOKIE['csrfToken'] ) { } ```