什么是 CSRF 攻击?
CSRF(Cross-Site Request Forgery),中文名为跨站请求伪造,是一种常见的 web 攻击方式。攻击者利用用户已经登录过的状态,在用户不知情的情况下,以用户的名义完成一系列操作,例如转账、修改密码等。
攻击流程可以简单地描述为:
- 用户登录网站 A,此时网站 A 会生成一个会话(session)并记录在用户浏览器的 cookie 中;
- 用户在未退出网站 A 的情况下,访问恶意网站 B;
- 恶意网站 B 的页面中,通过某些手段(例如图片、链接)发起一个对网站 A 的请求,并携带一些攻击者设定的参数;
- 用户的浏览器会自动地在未知情况下向网站 A 发起请求,并携带恶意网站设定的参数,导致攻击行为成功实施。
防止 CSRF 攻击的方式
主流的防御 CSRF 攻击的方式是在服务端进行验证,通过检查 request header 中的 referer 或 origin 字段,判断请求来源是否合法。但是,这种方式并非绝对可靠,因为攻击者可以轻松地伪造这些字段。
更可靠的方式是采用 CSRF Token。CSRF Token 是通过在表单中插入一个隐藏的 token,然后在每次发送请求时将 token 一起发送到服务器端进行验证,确保请求的来源是合法的。
在 Express.js 中,我们可以采用以下方式来防御 CSRF 攻击:
- 安装
csurf
插件:npm install csurf --save
- 加载
csurf
模块,并将生成的 Token 添加到 res.locals 中 - 使用
csrf
中间件对 POST、PUT、DELETE 等需要修改数据的请求添加 CSRF Token 验证
示例代码如下:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- ---- - ---------------- ----- ------------ - ------------------------ ----- --- - --------- -- -- ------------ --- ----------------------- -- --- ----- --- ----- -------------- - ------ ------- ---- -- -- ---- ---- ----- --- ---------- - ------------- ---- ----- -- - -------------------- - --------------- ------ -- -- - --------------- ------------ ---- ----- -- ------------- --------------- ----- ---- -- - -------------- ----- ------- -- ---------------- -- -- - ------------------- -- ------- -- ----------------------- --
总结
在应对 CSRF 攻击时,必须保持敏感,采取有效的措施,避免造成不必要的损失。通过采用 CSRF Token 进行验证,可以提高 web 应用程序的安全性,再结合一些安全策略和措施,可以从根本上防止 CSRF 攻击。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648b162e48841e9894976243