什么是 CSRF 攻击
跨站请求伪造(Cross-site request forgery,简称 CSRF)是一种常见的 Web 攻击方式,攻击者利用受害者在已登录的情况下的身份,伪造请求,以达到攻击的目的。
常见的 CSRF 攻击场景包括:在受害者未退出登录的情况下,攻击者通过构造恶意链接或者植入恶意代码的方式,诱导受害者点击链接或者访问页面,从而实现攻击。
如何防范 CSRF 攻击
防范 CSRF 攻击的主要手段是在服务端对请求进行验证,确保请求来源是合法的。
常见的防范 CSRF 攻击的方式包括:
- 使用 CSRF Token:在服务器端生成一个随机的 Token,每次请求时将 Token 发送到客户端,客户端发送请求时将 Token 带上,服务器端对 Token 进行验证,确保请求来源是合法的。
- 使用 SameSite 属性:设置 Cookie 的 SameSite 属性为 Strict 或者 Lax,确保 Cookie 只能在同站点下使用,防止跨站点使用 Cookie。
- 检查 Referer:检查请求的 Referer 是否为当前站点,防止跨站点请求。
本文将介绍如何在 Express.js 中使用 csurf 中间件来防范 CSRF 攻击。
使用 csurf 中间件
csurf 是一个 Node.js 的中间件,用于防范 CSRF 攻击。csurf 的原理是在服务器端生成一个随机的 Token,并将 Token 保存在 Cookie 中,每次请求时从 Cookie 中获取 Token,将 Token 发送到客户端,客户端发送请求时将 Token 带上,服务器端对 Token 进行验证,确保请求来源是合法的。
安装 csurf
在使用 csurf 中间件之前,需要先安装 csurf:
npm install csurf
使用 csurf
在 Express.js 中使用 csurf 很简单,只需要在 app.js 中引入 csurf,然后使用 csurf 中间件即可。
// javascriptcn.com 代码示例 const express = require('express'); const cookieParser = require('cookie-parser'); const csrf = require('csurf'); const app = express(); app.use(cookieParser()); app.use(csrf({ cookie: true })); app.get('/', (req, res) => { res.send(` <form action="/" method="POST"> <input type="hidden" name="_csrf" value="${req.csrfToken()}"> <button type="submit">Submit</button> </form> `); }); app.post('/', (req, res) => { res.send('CSRF token is valid'); }); app.listen(3000, () => { console.log('Server is running on http://localhost:3000'); });
在上面的代码中,我们首先引入了 csurf 中间件,然后在 app.js 中使用 csurf 中间件:
app.use(csrf({ cookie: true }));
在使用 csurf 中间件时,我们可以传入一个配置对象,其中 cookie 为 true 表示将 Token 保存在 Cookie 中。
在 GET 请求中,我们在表单中添加了一个隐藏的 input,其中 name 为 _csrf,value 为 req.csrfToken(),表示将 Token 发送到客户端。
在 POST 请求中,我们可以使用 req.csrfToken() 获取客户端发送过来的 Token,然后对 Token 进行验证,确保请求来源是合法的。
验证 Token
在使用 csurf 中间件时,我们可以通过设置 onerror 回调函数来处理 Token 验证失败的情况。
// javascriptcn.com 代码示例 const csrfProtection = csrf({ cookie: true }); app.use((err, req, res, next) => { if (err.code !== 'EBADCSRFTOKEN') return next(err); res.status(403).send('Invalid CSRF token'); }); app.use('/', csrfProtection, (req, res) => { res.send(` <form action="/" method="POST"> <input type="hidden" name="_csrf" value="${req.csrfToken()}"> <button type="submit">Submit</button> </form> `); });
在上面的代码中,我们首先定义了一个 csrfProtection 中间件,然后在使用时通过 csrfProtection 参数传入。
当 Token 验证失败时,csurf 会抛出一个 EBADCSRFTOKEN 错误,我们可以通过设置 onerror 回调函数来处理 Token 验证失败的情况。
总结
在本文中,我们介绍了 CSRF 攻击的原理和防范方式,以及如何在 Express.js 中使用 csurf 中间件来防范 CSRF 攻击。
使用 csurf 中间件可以很方便地防范 CSRF 攻击,同时也提醒我们在开发 Web 应用时要注意安全性,防范各种攻击。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657c5993d2f5e1655d72b618