【一】csrf跨站请求伪造详解
- CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
- 攻击者通过诱导受害者访问恶意网站或点击恶意链接
- 将恶意请求发送到目标网站上
- 利用受害者在目标网站中已登录的身份来执行某些操作
- 从而达到攻击的目的。
- 要保护自己免受CSRF攻击,网站开发者可以采取以下措施:
- 使用CSRF令牌:
- 在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。
- 每次提交请求时都会验证该令牌,以确保请求是合法的。
- 启用SameSite属性:
- 将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。
- 这可以在一定程度上缓解CSRF攻击。
- 严格验证请求来源:
- 服务器端可以验证请求的来源是否为预期的网站域名
- 例如检查HTTP Referer头部。
- 使用验证码:
- 在敏感操作(如转账、更改密码等)上使用验证码
- 增加用户身份验证的防护。
【二】csrf跨域请求伪造
- 钓鱼网站
- 搭建一个类似正规网站的页面
- 用户点击网站链接,给某个用户打钱
- 打钱的操作确确实实提交给了中国银行的系统,用户的钱也确实减少
- 但是唯一不同的是,账户打钱的账户不是用户想要打钱的目标账户,变成了其他用户
- 内部本质
- 在钓鱼网站的页面针对对方账户,只给用户提供一个没有name属性的普通input框
- 然后在内部隐藏一个已经写好带有name属性的input框
- 如何避免上面的问题
- csrf跨域请求伪造校验
- 网站在给用户返回一个具有提交数据功能的页面的时候会给这个页面加一个唯一标识
- 当这个页面后端发送post请求的时候,我们后端会先校验唯一标识
- 如果成功则正常执行
- 如果唯一标识不符合则拒绝连接(403 forbidden)
【1】正常服务端
<h1>这是正规的网站</h1>
<form action="" method="post">
<p>当前账户 :>>>> <input type="text" name="start_user"></p>
<p>目标账户 :>>>> <input type="text" name="end_user"></p>
<p>转账金额 :>>>> <input type="text" name="money"></p>
<input type="submit">
</form>
def transform_normal(request):
if request.method == "POST":
user_start = request.POST.get("start_user")
user_end = request.POST.get("end_user")
money = request.POST.get("money")
return HttpResponse(f"当前账户 :>>> {user_start} 向目标用户 :>>> {user_end} 转账了 :>>> {money}")
return