什么是 CSRF 攻击?
CSRF(Cross-site request forgery,跨站请求伪造)攻击是一种常见的网络攻击方式,攻击者通过冒充受害者的身份向网站发送请求。这种攻击方式通常利用浏览器的安全漏洞,在用户不知情的情况下执行一系列操作,如盗取用户身份、修改用户数据等。
CSRF 攻击通常发生在用户登录状态没有失效的情况下,攻击者通过欺骗受害者打开恶意页面或者通过篡改恶意广告等方式在受害者的浏览器上执行恶意脚本,从而对网站进行攻击。
CSRF 攻击的原理
CSRF 攻击通常利用浏览器发送请求时会自动携带登录凭证的特性,攻击者通过欺骗用户打开恶意页面,向攻击站点发送包含受害者登录凭证的请求。
攻击的基本流程如下:
- 用户登录 A 网站,并保持登录状态;
- 攻击者诱导用户打开恶意网站 B;
- 恶意网站 B 向 A 网站发送请求,请求中携带了用户的登录凭证;
- A 网站根据请求中携带的登录凭证验证用户身份,并执行攻击者指定的操作。
如何防止 CSRF 攻击?
1. 验证来源站点(SameSite Cookies)
SameSite Cookies 是一种最新的 Web 标准,它可以限制 HTTP Cookie 只能在同域名站点之间进行传递。SameSite Cookies 通常可以设置成两个值中的一个:
- "strict":限制 Cookie 在同域名站点进行传递;
- "lax":允许部分跨域。
可以在 Fastify 中配置包含 SameSite Cookies 的 Cookie,具体方法如下:
-- -------------------- ---- ------- ------------------------------------------- - ------- ------------ ------------- ------- - ------- ----- --------- ----- --------- ------ ----- --- - ---
设置 SameSite 属性为 "lax" 表示允许部分跨域,设置为 "strict" 则完全禁止跨域访问。
2. 验证请求头(CSRF-Token)
在发送 POST、PUT、DELETE 等需要验证 CSRF 的请求时,可以在请求头中添加一个自定义的 CSRF-Token,服务端通过对比请求头中的 CSRF-Token 和 Cookie 中的 CSRF-Token 是否一致来判断请求是否为合法的。
在 Fastify 中可以使用 fastify-csrf 插件来支持 CSRF-Token 的校验。
-- -------------------- ---- ------- ----- ------- - --------------------- ----------------------------------------- - -------------- - ------- ----------- - --- -------------------- --------- ------ -- - ----- --------- - -------------------- ------ ----- ---------- ----------------- --------------- ------------ ------------- ----------------- ------ ------------- ------------ --------------------- ------ ----------- ---------------- ------ --------------- ---------------- ------- ------------------------- ---------- --- ----------------------- ----- --------- ------ -- - --- - ----- --------------------- ------ ---------------------- - ----- --- - ------ -------------------- - ---
在该示例中,我们使用 fastify-csrf 插件生成 CSRF-Token,并在表单中添加一个隐藏的 input,把 CSRF-Token 传递给服务器端。当用户提交表单时,我们通过 verifyCsrf 方法来验证 CSRF-Token 的合法性,如果校验通过,就可以处理表单数据。
总结
在 Fastify 中,我们可以使用 SameSite Cookies 和 CSRF-Token 验证来有效防止 CSRF 攻击。使用 fastify-csrf 插件可以方便地生成和校验 CSRF-Token,在实际开发中应该根据业务需求来选择合适的防御方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6461ced7968c7c53b03272af