Django-CSRF的理解
2017-07-05 20:58
204 查看
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。通俗来讲,就是以你的身份,来制造恶意请求。
在没有关闭的情况下,又开了Tab,打开了一个黄色网站
你在黄网中看到了一个劲爆的链接(假设该名字为:xxx女星劲爆写真,其实真实的url为该银行系统转账链接)
而你不小心点了,因为你的银行系统页面未关闭,并且浏览器还存有你登录的Cookie,所以你的钱就被这样盗走了
就算你的银行系统关闭了,但是你的浏览器保存它的Cookie未过期的话,点了连接仍可以盗走你的钱
- form表单设置
Ajax请求时设置
csrf_exempt:对单个网络请求取消保护,即使在settings添加了csrf中间件也不会进行保护
参考资料:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://baike.baidu.com/item/CSRF
危害:
CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI……而现在,互联网上的许多站点仍对此毫无防备,对其进行防范的资源也相当稀少,以至于安全业界称CSRF为“沉睡的巨人”。举个栗子
浏览器打开了银行系统,并且登录了在没有关闭的情况下,又开了Tab,打开了一个黄色网站
你在黄网中看到了一个劲爆的链接(假设该名字为:xxx女星劲爆写真,其实真实的url为该银行系统转账链接)
而你不小心点了,因为你的银行系统页面未关闭,并且浏览器还存有你登录的Cookie,所以你的钱就被这样盗走了
就算你的银行系统关闭了,但是你的浏览器保存它的Cookie未过期的话,点了连接仍可以盗走你的钱
Django对CSRF防护
对于上面的栗子,楼主建议广大朋友千万不要上黄网,不要随便点开什么链接。回归正题,Django第一次来自客户端的请求时,都会在服务器上产生一个Token,每次Post请求都会要求带上这个Token,否则将不是安全的连接,将会被阻止,返回403错误。那我们怎么在Django中进行设置呢?起始Django本身就帮你做好了CSRF防护,在settings中它自动就帮你加上了‘django.contrib.auth.middleware.AuthenticationMiddleware’。我们只需要在form表单里面添加{% csrf_token %},进行post请求时,就自动将这个Token提交到了服务器,就表示你这个请求是安全的。- form表单设置
<form method="POST" action="/login/" > <!-- 固定写法 --> {% csrf_token %} <p> <input type="text" name="name" placeholder="用户名"> </p> <p> <input type="password" name="password" placeholder="密码"> </p> <input type="submit" value="提交"> </form>
Ajax请求时设置
<script src="/static/jquery-3.2.1.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(":button").click(function(){ $.ajax({ $.ajax({ url:"/login/", type:"POST", data:{"name":"python","password":"123"}, headers:{"X-CSRFtoken":$.cookie("csrftoken")}, success:function (data) { console.log("success"); } }) }) }) </script>
csrf_protect和csrf_exempt
csrf_protect:对单个网络请求进行保护,即便在settings的中间件中没有设置:’django.middleware.csrf.CsrfViewMiddleware’,也照样会进行保护from django.views.decorators.csrf import csrf_protect @csrf_protect def main(request): username = request.session.get("has_login",None) return render(request,"welcome.html",{"username":username})
csrf_exempt:对单个网络请求取消保护,即使在settings添加了csrf中间件也不会进行保护
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def main(request): username = request.session.get("has_login",None) return render(request,"welcome.html",{"username":username})
参考资料:http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://baike.baidu.com/item/CSRF
相关文章推荐
- Django 的 CSRF 保护机制理解
- 我理解的django的CSRF防御!
- django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方式
- [Django数据库模型]理解Django里的MTV开发模式
- Django1.8:403错误:CSRF verification failed. Request aborted.
- 请教大神关于 Django 自动发邮件时候的 CSRF 问题
- Django(一)--Web框架理解
- Django POST请求 错误 forbidden(403) CSRF verification failed. Request aborted 解决方法
- Django和Tornado 的理解
- django csrf
- django中使用POST方法 使用ajax后出现“CSRF token missing or incorrect”
- django CSRF protect (防止出现Forbidden 403)
- Django之Form、CSRF、cookie和session
- 理解django里的null和blank
- django CSRF token missing or incorrect.
- 关于Django出现CSRF token missing or incorrect.问题解决办法(参考官方文档)
- Django系列7---cookie、session、json、csrf_token
- 解决django出现CSRF token missing or incorrect.错误
- 理解 django.contrib.staticfiles
- django-CSRF verification failed. Request aborted