Express.js 中的防止 CSRF 攻击措施

阅读时长 3 分钟读完

什么是 CSRF 攻击?

CSRF(Cross-Site Request Forgery),中文名为跨站请求伪造,是一种常见的 web 攻击方式。攻击者利用用户已经登录过的状态,在用户不知情的情况下,以用户的名义完成一系列操作,例如转账、修改密码等。

攻击流程可以简单地描述为:

  1. 用户登录网站 A,此时网站 A 会生成一个会话(session)并记录在用户浏览器的 cookie 中;
  2. 用户在未退出网站 A 的情况下,访问恶意网站 B;
  3. 恶意网站 B 的页面中,通过某些手段(例如图片、链接)发起一个对网站 A 的请求,并携带一些攻击者设定的参数;
  4. 用户的浏览器会自动地在未知情况下向网站 A 发起请求,并携带恶意网站设定的参数,导致攻击行为成功实施。

防止 CSRF 攻击的方式

主流的防御 CSRF 攻击的方式是在服务端进行验证,通过检查 request header 中的 referer 或 origin 字段,判断请求来源是否合法。但是,这种方式并非绝对可靠,因为攻击者可以轻松地伪造这些字段。

更可靠的方式是采用 CSRF Token。CSRF Token 是通过在表单中插入一个隐藏的 token,然后在每次发送请求时将 token 一起发送到服务器端进行验证,确保请求的来源是合法的。

在 Express.js 中,我们可以采用以下方式来防御 CSRF 攻击:

  1. 安装 csurf 插件:npm install csurf --save
  2. 加载 csurf 模块,并将生成的 Token 添加到 res.locals 中
  3. 使用 csrf 中间件对 POST、PUT、DELETE 等需要修改数据的请求添加 CSRF Token 验证

示例代码如下:

-- -------------------- ---- -------
----- ------- - ------------------
----- ---- - ----------------
----- ------------ - ------------------------

----- --- - ---------

-- -- ------------ ---
-----------------------

-- --- ----- ---
----- -------------- - ------ ------- ---- --

-- ---- ---- ----- --- ---------- -
------------- ---- ----- -- -
  -------------------- - ---------------
  ------
--

-- - --------------- ------------ ---- ----- --
------------- --------------- ----- ---- -- -
  -------------- ----- -------
--

---------------- -- -- -
  ------------------- -- ------- -- -----------------------
--

总结

在应对 CSRF 攻击时,必须保持敏感,采取有效的措施,避免造成不必要的损失。通过采用 CSRF Token 进行验证,可以提高 web 应用程序的安全性,再结合一些安全策略和措施,可以从根本上防止 CSRF 攻击。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648b162e48841e9894976243

纠错
反馈