CSRF
CSRF
全拼为Cross Site Request Forgery
,译为跨站请求伪造。CSRF
指攻击者盗用了你的身份,以你的名义发送恶意请求。- 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
- 造成的问题:个人隐私泄露以及财产安全。
CSRF攻击示意图
客户端访问服务器时没有同服务器做安全验证
防止CSRF攻击
提示:Django默认开启了CSRF安全验证功能
防止CSRF攻击原理代码演示
准备:正则匹配urls和视图
# csfr url(r'^csrf/$', views.csrf), url(r'^csrf1/$', views.csrf1),
# csrf def csrf(request): return render(request, 'Book/csrf.html') # 处理POST请求 def csrf1(request): dict = request.POST uname = dict.get('uname') money = dict.get('money') # 获取csrf验证码 token = dict.get('csrfmiddlewaretoken') str = '%s--%s--%s' % (uname, money, token) return HttpResponse(str)
无csrftoken的模板代码
无csrftoken的网页源码
无csrftoken的表单提交
CSRF验证失败
有csrftoken的模板代码
有csrftoken的网页源码
有csrftoken的表单提交
防止CSRF攻击原理示意图
总结:Django 提供的 CSRF 防护机制
1.Django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。
2.在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
3.在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 csrf_token标签, django 就会自动帮我们生成)
4.在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提 交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.