Django csrf 验证问题的实现
关于csrf的基本了解
百度百科:CSRF(Cross-siterequestforgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。通过伪装来自受信任用户的请求来利用受信任的网站。
简单来说就是攻击者盗用你的身份,以你的名义来发送恶意请求。比如说用户通过账号密码访问了网站A,A网站将一些cookie信息保存在浏览器中实现用户状态行为跟踪。这时用户又打开了B网站,B网站返回了一些恶意代码,并请求访问A。这样浏览器就会携带cookie以用户的权限访问A网站并执行代码。而在服务器看来,这些都是正常的用户操作。
Django提供的CSRF防护机制
django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个token,把这个token放在cookie里。然后每次POST请求都会带上这个token,
这样就能避免被CSRF攻击。
1.在返回的HTTP响应的cookie里,django会为你添加一个csrftoken字段,其值为一个自动生成的token
2.在所有的POST表单时,必须包含一个csrfmiddlewaretoken字段(只需要在模板里加一个tag,django就会自动帮你生成,见下面)
3.在处理POST请求之前,django会验证这个请求的cookie里的csrftoken字段的值和提交的表单里的csrfmiddlewaretoken字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的csrf攻击,返回403Forbidden.
4.在所有ajaxPOST请求里,添加一个X-CSRFTOKENheader,其值为cookie里的csrftoken的值
Django里如何使用CSRF防护
- 首先,最基本的原则是:GET请求不要用有副作用。也就是说任何处理GET请求的代码对资源的访问都一定要是“只读“的。
- 要启用django.middleware.csrf.CsrfViewMiddleware这个中间件
- 再次,在所有的POST表单元素时,需要加上一个{%csrf_token%}tag
- 在渲染模块时,使用RequestContext。RequestContext会处理csrf_token这个tag, 从而自动为表单添加一个名为csrfmiddlewaretoken的input
在Django中对csrf的防范
Django中自带了防止csrf攻击的功能,但对于初学者来说可能不知道如何使用,并给自己带来些意外的麻烦。
例如:一个正常的表单提交操作却总是报错。
Django中GET请求不需要csrf认证,post请求需要正确的认证才能得到正确的返回结果。
我们先处理一下对表单提交的csrf验证问题:一般在POST表单中加入{%csrf_token%}
{%csrf_token%}
加入了这句话后,再次提交post表单就不会出现问题了。
或者是另一个思路:禁用csrf
不过这样可能带来的危害你自己要想清楚了。
全局禁用:settings文件中找到关于csrf的中间件,直接注释。
针对性禁用:在表单提交的对应视图函数上加上一个装饰器@csrf_exempt
——————————————————————
{%csrf_token%}实际上是一个模板语法,将项目的token值写入到前端页面的表单中,这个值在建立django项目时就已经自动生成,可以在setting中看到。
——————————————————————–
下面再看一下Ajax调用时的处理方式
在使用jquery的ajax或者post之前可以加入一段js代码
jQuery(document).ajaxSend(function(event,xhr,settings){ functiongetCookie(name){ varcookieValue=null; if(document.cookie&&document.cookie!=''){ varcookies=document.cookie.split(';'); for(vari=0;i或者是直接在模板文件中写入
$.ajaxSetup({ data:{csrfmiddlewaretoken:'{{csrf_token}}'}, });以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。