CSRF攻击本质是利用用户已登录会话,通过恶意JS静默发起带Cookie的请求;防护核心是后端签发一次性Anti-CSRF Token并校验,辅以SameSite Cookie、Referer检查等手段,严禁GET改状态或前端生成token。
JavaScript环境下的CSRF攻击,本质是利用用户已登录的会话状态,通过恶意页面里的JS代码自动发起目标网站的请求(比如转账、改密),而浏览器会悄悄带上Cookie,让服务器误以为是用户本人操作。
常见手法不是靠用户点按钮,而是脚本静默执行:
document.createElement('form')构造隐藏表单,填好参数后form.submit()
fetch或XMLHttpRequest发POST请求,credentials: 'include'确保带Cookie触发GET型操作(如登出、关注)核心思路是“服务端发令牌,前端必须回传,且每次不重复”:
csrf_token=abc123),写入HTML hidden input 或注入到JS变量中X-CSRF-Token)或请求体中带上该token这些能提高门槛,但都有绕过可能,适合叠加使用:
SameSite=Lax或Strict,可阻止大部分跨站带Cookie的GET/POST请求Referer是否来自自家域名;但部分浏览器或隐私模式可能不发Referer防护失效常因细节疏漏:
Content-Type: application/json本身不能防CSRF——恶意站点仍可用fetch发带Cookie的JSON请求/delete?id=123),这类接口极易被或标签触发基本上就这些。Token机制是基石,SameSite和Referer是加分项,而杜绝GET改状态、避免前端生成token,是不踩坑的前提。