【一】跨站请求伪造介绍
【1】引入#
- CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
- 攻击者通过诱导受害者访问恶意网站或点击恶意链接
- 将恶意请求发送到目标网站上
- 利用受害者在目标网站中已登录的身份来执行某些操作
- 从而达到攻击的目的。
【2】举例#
- 假设受害者在一家网银网站上登录账户,然后继续浏览其他网页。
- 同时,攻击者通过电子邮件等方式向受害者发送了一封包含恶意链接的邮件。
- 当受害者点击该链接时,潜在的威胁就会变得非常现实。
- 该链接指向一个由攻击者操纵的网站,该网站上的恶意代码会自动向网银网站发送一个请求,请求转账到攻击者的账户。
- 由于受害者在网银网站中已经登录,所以该请求会被认为是合法的,这样攻击者就可以成功地进行转账操作。
【3】保护措施#
在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。
每次提交请求时都会验证该令牌,以确保请求是合法的。
将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。
这可以在一定程度上缓解CSRF攻击。
服务器端可以验证请求的来源是否为预期的网站域名
例如检查HTTP Referer头部。
在敏感操作(如转账、更改密码等)上使用验证码
增加用户身份验证的防护
【二】钓鱼网站案例
- 在早期的网站很容易出现钓鱼诈骗网站的现象,就是钓鱼页面和真的页面做的一模一样,用户在进行金额转账的时候,就会把钱打到陌生人的账户里
- 如果没有csrf校验,就很容易出现这个现象
- 下面对这个现象做一个演示
【1】钓鱼网站#
【三】CSRF校验
【1】介绍#
- csrf校验是一种用于防止跨站请求伪造(Cross-Site Request Forgery)攻击的安全措施。
【2】csrf校验策略#
- csrf中间件会在用户返回一个具有提交数据功能的页面的时候给这个页面加一个唯一标识
- 当这个页面朝后端发送post请求的时候,我的后端会先校验唯一标识,如果唯一标识不对会直接拒绝访问,如果成功则正常运行
【四】POST请求校验CSRF
## 在form表单内加上 {% csrf_token %}
<form action="" method="post">
{% csrf_token %}
<p>转账对象: <input type="text" name="username"></p>
<p>转账金额: <input type="text" name="money"></p>
<p><input type="submit" value="转账"></p>
</form>
# 在浏览器访问的时候会发现这个csrf变成了一个很长很长的字符串,也就是唯一字符串
【2】Ajax携带CSRF#
<script>
$('#btn').on('click', function () {
$.ajax({
url: '',
type: 'post',
data: {'name': 'hqq','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
success: function (args) {
}
})
})
</script>
<script>
$('#btn').on('click', function () {
$.ajax({
url: '',
type: 'post',
data: {'name': 'hqq', 'csrfmiddlewaretoken':{% csrf_token %}},
success: function (args) {
}
})
})
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!