CSRF攻击防范指南
一. 概述
CSRF(Cross-Site Request Forgery)攻击
是一种利用用户已经登录的身份,在用户不知情的情况下发送恶意请求的攻击方式。攻击者可以通过构造恶意请求,诱骗用户点击链接或访问网站,从而实现对用户账户的非法操作,如修改密码,转账等。
二. CSRF攻击的过程
下面举一个简单的例子来说明CSRF攻击
的过程:
假设用户已经登录了一个银行网站,并且该网站使用了一个POST请求来处理转账操作。攻击者可以构造一个恶意网站,在该网站中包含一个隐藏的表单,该表单会自动提交一个POST请求到银行网站的转账接口。当用户访问恶意网站时,该表单会自动提交POST请求,从而实现对用户账户的非法转账操作。
具体来说,攻击者可以通过以下步骤实现CSRF攻击
:
- 攻击者构造一个恶意网站,并在该网站中包含一个隐藏的表单,该表单会自动提交一个POST请求到银行网站的转账接口。
- 攻击者诱骗用户访问恶意网站,或者通过其他方式将恶意网站的链接发送给用户。
- 当用户访问恶意网站时,该表单会自动提交POST请求到银行网站的转账接口,从而实现对用户账户的非法转账操作。
三. 防止CSRF攻击的措施
1. 验证请求来源
在服务器端对请求来源进行验证,只接受来自合法来源的请求。可以通过检查请求头中的Referer
字段或者使用CSRF Token
来实现。
下面举例说明如何验证请求来源:
- 在服务器端对每个
POST请求
进行Referer
的验证。
//验证Referer
if (req.headers.referer !== 'https://www.example.com/') {
return res.status(403).send('Invalid Referer');
}
- 在前端页面中设置
Referer
的值
<form action="/transfer" method="post" ref="transferForm">
<input type="text" name="amount">
<input type="submit" value="Transfer" @click.prevent="submitForm">
</form>
<script>
export default {
methods: {
submitForm() {
// 设置Referer的值
this.$refs.transferForm.setAttribute('referrer', 'https://www.example.com/');
// 提交表单
this.$refs.transferForm.submit();
}
}
}
</script
通过上述步骤,可以有效地防范CSRF攻击
。服务器端对每个POST请求
进行Referer
的验证,只接受来自合法来源的请求。同时,在前端页面中设置Referer
的值,确保请求来源的合法性。需要注意的是,Referer
的值可以被攻击者伪造,因此需要结合其他防范措施来提高安全性。
2. 使用CSRF Token
在每一个表单中添加一个随机生成的Token
,并在服务器端进行验证。攻击者无法获取到Token
,从而无法构造恶意请求。
下面以使用CSRF Token
方式为例,说明如何验证请求来源:
- 在服务器端生成一个随机的
CSRF TOken
,并将其存储在Session中。
//生成随机的CSRF Token
const csrfToken = Math.random().toString(36).slice(2);
//将CSRF Token存储在Session中
req.session.csrfToken = csrfToken;
- 在客户端每个表单中添加一个隐藏的
input
元素 ,用户存储CSRF Token
。
<form action="/transfer" method="post">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<input type="text" name="amount">
<input type="submit" value="Transfer">
</form>
- 在服务器端对每个
POST请求
进行CSRF Token
的验证。
//验证CSRF Token
if(req.body._csrf !== req.session.csftToken) {
return res.status(403).send('Invalid CSRF Token');
}
通过以上步骤,可以有效地防范CSRF攻击
。攻击者无法获取到服务器端生成的每个随机CSRF Token
,从而无法构造恶意请求。同时,服务器端对每个POST请求
进行CSRF Token
的验证,只接受来自合法来源的请求。
3. 避免使用GET请求
GET请求
可以通过URL
传递参数,容易被攻击者构造恶意请求。使用POST请求
可以避免这种情况。
下面是一个示例代码:
<img src="http://www.target.com/transfer?amount=1000&to=attacker" />
在这个示例代码中,攻击者构造了一个 img 标签,其中的 src 属性指向了目标网站的转账接口,并且包含了攻击代码。当用户访问攻击者的网站并加载了这个 img 标签时,浏览器会自动向目标网站发送一个 get 请求,请求中包含了攻击代码,从而触发 CSRF 攻击。
4. 限制敏感操作
对于一些敏感操作,如修改密码,转账等,可以要求用户输入密码或者进行二次验证,从而避免被攻击者利用已经登录的身份进行非法操作。
另外,还可以通过一些其他的措施来限制敏感操作,例如:
- 验证码:在进行敏感操作时,要求用户输入验证码进行验证,从而防止自动化攻击。
- 双因素认证:在进行敏感操作时,要求用户进行双因素认证,例如输入密码和短信验证码等,从而提高安全性。
- 记录日志:在进行敏感操作时,记录相关日志信息,从而可以及时发现异常操作并进行处理。
通过以上措施,可以有效限制敏感操作,提高系统的安全性,防范 CSRF 攻击。
四. 总结
防范CSRF攻击
需要通过多个方面入手,包括验证请求来源,使用CSRF Token
,避免使用GET请求
,限制敏感操作等。只有综合使用这些措施,才能有效地保护用户账户的安全。
原文链接:https://juejin.cn/post/7236372620999196733 作者:EARPHONE