什么是 CSRF 攻击?
CSRF(Cross-site request forgery),中文名为跨站请求伪造,是一种常见的网络攻击方式。攻击者通过构造恶意网站或者利用已经存在的漏洞,让用户在已经登录的网站上执行某些操作,例如转账、修改密码等,从而达到攻击的目的。
CSRF 攻击原理
CSRF 攻击的原理是利用用户在已经登录的网站中的身份信息,构造伪造的请求,以达到攻击的目的。攻击者可以通过构造一个链接或者一个表单,让用户在不知情的情况下执行某些操作,比如:
<img src="https://example.com/api/transfer?to=attacker&amount=10000" width="0" height="0" style="display:none;">
上面的代码会向 https://example.com/api/transfer
发送一个转账请求,将 10000 元转账到攻击者的账户中。当用户访问包含上述代码的页面时,浏览器会自动向 https://example.com/api/transfer
发送请求,由于用户已经登录,因此请求会携带用户的身份信息,攻击者就可以利用这个信息执行转账操作。
CSRF 攻击的防御策略
1. 验证来源站点
验证来源站点是防御 CSRF 攻击的最基本策略。在 Express 中,可以通过设置 origin
头来实现验证来源站点的功能。当请求的来源站点和目标站点不一致时,可以返回一个 403 错误,拒绝请求。
// javascriptcn.com 代码示例 const express = require('express'); const app = express(); app.use((req, res, next) => { const origin = req.get('origin'); if (origin !== 'https://example.com') { return res.status(403).send('Forbidden'); } next(); });
上面的代码会验证请求的来源站点是否为 https://example.com
,如果不是,则返回 403 错误。
2. 添加 CSRF Token
在每个表单中添加一个 CSRF Token,可以有效地防御 CSRF 攻击。在 Express 中,可以使用 csurf
中间件来添加 CSRF Token。
// javascriptcn.com 代码示例 const express = require('express'); const csrf = require('csurf'); const cookieParser = require('cookie-parser'); const app = express(); app.use(cookieParser()); app.use(csrf({ cookie: true })); app.get('/form', (req, res) => { const csrfToken = req.csrfToken(); res.send(` <form action="/transfer" method="POST"> <input type="hidden" name="_csrf" value="${csrfToken}"> <input type="text" name="to" placeholder="收款人"> <input type="number" name="amount" placeholder="金额"> <button type="submit">转账</button> </form> `); }); app.post('/transfer', (req, res) => { const { to, amount } = req.body; // 验证 CSRF Token if (req.csrfToken() !== req.body._csrf) { return res.status(403).send('Forbidden'); } // 执行转账操作 // ... res.send('转账成功'); });
上面的代码中,使用了 csurf
中间件来添加 CSRF Token,并在表单中添加了一个隐藏的 _csrf
字段。在处理 POST 请求时,验证请求中的 CSRF Token 是否和服务器生成的一致,如果不一致,则返回 403 错误。
3. 添加 SameSite 属性
在 Cookie 中添加 SameSite 属性可以有效地防御 CSRF 攻击。SameSite 属性可以控制 Cookie 的跨站访问,当设置为 Strict 时,只有同站点的请求才能携带 Cookie,从而防止 CSRF 攻击。
在 Express 中,可以使用 cookie-session
中间件来添加 SameSite 属性。
// javascriptcn.com 代码示例 const express = require('express'); const cookieSession = require('cookie-session'); const app = express(); app.use(cookieSession({ name: 'session', keys: ['key1', 'key2'], maxAge: 24 * 60 * 60 * 1000, // 1 day sameSite: 'strict', // 添加 SameSite 属性 }));
上面的代码中,使用了 cookie-session
中间件来添加 Cookie,并设置了 SameSite 属性为 Strict。
总结
CSRF 攻击是一种常见的网络攻击方式,可以通过验证来源站点、添加 CSRF Token、添加 SameSite 属性等方式来防御。在使用 Express.js 开发应用时,可以使用 origin
头、csurf
中间件、cookie-session
中间件等工具来实现防御 CSRF 攻击的功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6565968cd2f5e1655ded0aca