在没有XSS防御的情况下,CSRF防御仍然可以提供一定的安全保护,尽管可能无法完全避免攻击。以下是一些解决方法和代码示例:
- 随机令牌(Random Token):在每个表单提交或重要操作中,生成一个唯一的随机令牌,并将其嵌入到请求中。服务器接收到请求后,验证令牌的有效性。这样可以防止攻击者伪造请求。
示例代码:
<form action="/delete" method="POST">
<input type="hidden" name="csrf_token" value="随机令牌">
<!-- 其他表单字段 -->
<input type="submit" value="删除">
</form>
服务器端验证代码(假设使用Node.js):
app.post('/delete', (req, res) => {
const csrfToken = req.body.csrf_token;
// 验证令牌的有效性
if (csrfToken === req.session.csrf_token) {
// 执行删除操作
// ...
} else {
// 令牌无效,拒绝请求
// ...
}
});
- SameSite Cookie属性:使用SameSite属性设置Cookie,限制浏览器仅在同一站点下发送Cookie,从而减少跨站点请求。这可以防止某些类型的CSRF攻击。
示例代码(使用Express.js设置SameSite属性):
app.use((req, res, next) => {
res.cookie('session', 'session_value', {
sameSite: 'lax',
// 其他Cookie属性
});
next();
});
- Referer检查:检查请求的Referer头部,确保请求来自预期的来源。请注意,Referer头部可能会被某些浏览器禁用或伪造,因此该方法不可靠。
示例代码:
app.post('/delete', (req, res) => {
const referer = req.headers.referer;
// 检查Referer是否来自预期的域名
if (referer && referer.startsWith('http://example.com')) {
// 执行删除操作
// ...
} else {
// Referer无效,拒绝请求
// ...
}
});
尽管以上方法可以提供一定的保护,但仍然建议同时实施XSS防御措施,以提高应用程序的整体安全性。