Express.js 中的跨站请求伪造(CSRF)保护指南

阅读时长 6 分钟读完

什么是 CSRF 攻击?

CSRF(Cross-Site Request Forgery)攻击也被称为 “One Click Attack” 或者 “Session Riding”,是一种非常常见的攻击方式。在 CSRF 攻击中,攻击者通过某些方式诱骗用户打开了一个攻击者构造的网页,在用户不知情的情况下,发送一个伪造的请求到被攻击网站上,从而实现攻击目的。

例如,当你在一个论坛网站上单击点赞按钮时,会向服务器发送一个点赞请求。但是,如果攻击者先诱骗你打开了一个他构造的网页,这个网页中包含一个伪造的请求,那么当你单击点赞按钮时,该请求将被发送到服务器上,从而导致未经授权的点赞操作。

CSRF 攻击如何影响前端应用?

对于前端开发者来说,保护网站免受 CSRF 攻击的责任非常重大。在没有应对 CSRF 攻击的保护措施的情况下,攻击者可以通过 CSFR 操作来实现以下攻击形式:

  • 伪装用户:攻击者通过伪造请求,操作任何一个已知用户的账户,来进行其它犯罪行为;
  • 偷取用户的敏感信息:攻击者可以从服务端获取到任何一个已认证用户的敏感数据;
  • 进行网络欺诈:攻击者可以通过伪造请求,以用户身份执行任何取消或者修改账单、订单或者其他付款信息。

如何保护前端应用?

1. 防止 CSRF

1.1 HttpOnly Cookie

设置 HttpOnly 标记将 Cookie 作为 HTTP 响应 header 的一部分发送,防止攻击者通过 XSS 攻击获取 Cookie 内容。

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

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

1.2 SameSite Cookie

SameSite Strict 是一种 Cookie 属性,它可以防止 CSRF 攻击。通过设置 Cookie 为 SameSite Strict 后,同站点 Origin 的请求才能带上 Cookie,其他站点的请求将被拦截。

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

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

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

1.3 CSRF Token

在前端界面解决 CSRF 攻击,使用 CSRF Token。前端存储 CSRF Token,每次向服务端发送请求时附加 CSRF Token。

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

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

1.4 Referer Header

使用 Referer 头判定来源是否为本站,允许访问或者禁止访问。

2. 服务端模板

服务端模板不支持 JavaScript,因此对于任何恶意代码,没有机会执行。相比于客户端模板,服务端模板在防止 XSS 和 CSRF 风险方面更为有效。

3. 使用 CSP

CSP(Content-Security-Policy)是 W3C 标准,它可建立白名单规则,来指定哪些内容可以被加载和执行,哪些不可以。通过实现 CSP,你可以大大降低 XSS (跨站脚本攻击) 和 CSRF(跨站请求伪造攻击)的风险。

总结

本文介绍了 CSRF 攻击的概念和影响,并提供了一些保护前端应用免受 CSRF 的指南。以上方法只是其中的一部分,希望能够设法实现简单的 CSRF 防护,以保护你的应用。

参考资料

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

纠错
反馈