发布网友 发布时间:2024-09-27 15:53
共1个回答
热心网友 时间:2024-11-26 12:34
导读:本篇文章首席CTO笔记来给大家介绍有关Django中如何防止csrf的相关内容,希望对大家有所帮助,一起来看看吧。
django中写form表单时csrf_token的作用:
Django下的CSRF预防机制
CSRF预防机制
CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。
token防御的整体思路是:
第一步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;
第二步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;
第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;
1、Django下的CSRF预防机制
django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个token,把这个token放在cookie里。然后每次POST请求都会带上这个token,
这样就能避免被CSRF攻击。
在templete中,为每个POSTform增加一个{%csrf_token%}tag.如下:
在返回的HTTP响应的cookie里,django会为你添加一个csrftoken字段,其值为一个自动生成的token
在所有的POST表单模板中,加一个{%csrf_token%}标签,它的功能其实是给form增加一个隐藏的input标签,如下
,而这个csrf_token=cookie.csrftoken,在渲染模板时context中有context['csrf_token']=request.COOKIES['csrftoken']
在通过表单发送POST到服务器时,表单中包含了上面隐藏了crsrmiddlewaretoken这个input项,服务端收到后,django会验证这个请求的cookie里的csrftoken字段的值和提交的表单里的csrfmiddlewaretoken字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的csrf攻击,返回403Forbidden.
在通过ajax发送POST请求到服务器时,要求增加一个x-csrftokenheader,其值为cookie里的csrftoken的值,服务湍收到后,django会验证这个请求的cookie里的csrftoken字段与ajaxpost消息头中的x-csrftokenheader是否相同,如果相同,则表明是一个合法的请求
具体实现方法
django为用户实现防止跨站请求伪造的功能,通过中间件django.middleware.csrf.CsrfViewMiddleware来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:fromdjango.views.decorators.csrfimportcsrf_exempt,csrf_protect
1、原理
在客户端页面上添加csrftoken,服务器端进行验证,服务器端验证的工作通过'django.middleware.csrf.CsrfViewMiddleware'这个中间层来完成。在django当中防御csrf攻击的方式有两种:
1.在表单当中附加csrftoken
2.通过request请求中添加X-CSRFToken请求头。
注意:Django默认对所有的POST请求都进行csrftoken验证,若验证失败则403错误侍候。
Django设置cookie中的csrftoken
VUE向django发送post返回403:CSRFFailed:CSRFtokenmissingorincorrect解决方案:
哪些方法可以有效的防止csrf攻击
CSRF,全拼为Cross-siterequestforgery,也被称为one-clickattack或者sessionriding,中文名称叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误认为是用户的真实操作而去执行命令。常用于盗用账号、转账、发送虚假消息等。
攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。
CSRF攻击防范手段有哪些?
第一、验证HTTPReferer字段
HTTP头中的Referer字段记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,而如果黑客要对其实施CSRF攻击,他一般只能在他自己的网站构造请求。因此,可以通过验证Referer值来防御CSRF攻击。
第二、使用验证码
关键操作页面加上验证码,后台收到请求后通过判断验证码可以防御CSRF。但这种方法对用户不太友好。
第三、在请求地址中添加token并验证
CSRF攻击之所以成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。要抵御CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个*来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。这种方法要比检查Referer要安全,token可以在用户登陆后产生并放于session中,然后在每次请求时把token从session中拿出,与请求中的token进行比对,但这种方法的难点在于如何把token以参数的形式加入请求。
对于get请求,token将附在请求地址之后,这样URL就变成:。
对于post请求,要在form的最后加上inputtype="hidden"name="csrftoken"value="tokenvalue"/,这样就把token以参数的形式加入请求了。
第四、在HTTP头中自定义属性并验证
这种方法也是使用token并进行验证,和上一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求中,而是把它放到HTTP头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这样解决了上种方法在请求中加入token的不便;同时,通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,也不用担心token会透过Referer泄露到其他网站中去。
当我用django的超级用户登录时候,出现CSRF的错误,如图,怎么解决啊??需要在form后面加上csrf_token。如:
formmethod="post"{%csrf_token%}
xxx
/form
或者修改django源码:django/middleware/csrf.pyprocess_view
在“#Iftheuserdoesn'thaveaCSRFcookie”上面增加以下代码:
ifrequest.path.startswith('/admin'):
returnaccept()
如果django版本为1.2.5,则修改为:
ifrequest.path.startswith('/admin'):
returnself._accept(request)
这表示请求url是/admin的话,即使form后面没带csrf_token也可以访问。
什么是CSRF攻击,如何预防CSRF攻击,全称为“Cross-siterequestforgery”,中文名为跨站请求伪造,也被称为“OneClick
Attack”或者“SessionRiding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
XSS主要是利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求,来利用受信任的网站。与XSS相比,CSRF更具危险性。
CSRF攻击的危害:
主要的危害来自于攻击者盗用用户身份,发送恶意请求。比如:模拟用户发送邮件,发消息,以及支付、转账等。
如何防御CSRF攻击:
1、重要数据交互采用POST进行接收,当然POST也不是万能的,伪造一个form表单即可破解。
2、使用验证码,只要是涉及到数据交互就先进行验证码验证,这个方法可以完全解决CSRF。
3、出于用户体验考虑,网站不能给所有的操作都加上验证码,因此验证码只能作为一种辅助手段,不能作为主要解决方案。
4、验证HTTPReferer字段,该字段记录了此次HTTP请求的来源地址,最常见的应用是图片防盗链。
5、为每个表单添加令牌token并验证。
如何防止CSRF注入式攻击在Web应用程序侧防御CSRF漏洞,一般都是利用referer、token或者验证码,Nexus
的文章[7]已经写的很全面了;superhei也有提出bypass的思路[8],请参考他们的文章。
还有一个思路是在客户端防御,貌似可以做成一个类似HTTPWatch的软件,挂在浏览
器上拦截或者过滤跨域的cookie
怎么解决django的防csrf?djangopost出现403的解决办法据说,从django1.x开始,加入了CSRF保护。\x0d\x0a\x0d\x0aCSRF(Cross-siterequestforgery跨站请求伪造,也被称成为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。-------来自百度百科\x0d\x0a报错:Forbidden(403)\x0d\x0aCSRFverificationfailed.Requestaborted.Help\x0d\x0aReasongivenforfailure:CSRFtokenmissingorincorrect.\x0d\x0aIngeneral,thiscanoccurwhenthereisagenuineCrossSiteRequestForgery,orwhenDjango'sCSRFmechanismhasnotbeenusedcorrectly.ForPOSTforms,youneedtoensure:\x0d\x0a\x0d\x0aYourbrowserisacceptingcookies.\x0d\x0aTheviewfunctionusesRequestContextforthetemplate,insteadofContext.\x0d\x0aInthetemplate,thereisa{%csrf_token%}templatetaginsideeachPOSTformthattargetsaninternalURL.\x0d\x0aIfyouarenotusingCsrfViewMiddleware,thenyoumustusecsrf_protectonanyviewsthatusethecsrf_tokentemplatetag,aswellasthosethatacceptthePOSTdata.\x0d\x0aYou'reseeingthehelpsectionofthispagebecauseyouhaveDEBUG=TrueinyourDjangosettingsfile.ChangethattoFalse,andonlytheinitialerrormessagewillbedisplayed.\x0d\x0aYoucancustomizethispageusingtheCSRF_FAILURE_VIEWsetting.\x0d\x0a在网上找解决办法,说是提交参数中要有csrf_token,才能成功。但网上都是1.3或者1.4版本的解决办法,在1.5版本中测试已经不能用了。\x0d\x0a\x0d\x0a在1.5.1版本,我测试可行的解决办法有三种:\x0d\x0a一:\x0d\x0a关闭csrf保护功能。为视图函数添加@csrf_exempt修饰符。\x0d\x0a\x0d\x0afromdjango.views.decorators.csrfimportcsrf_exempt@csrf_exemptdefview(request):#yourcode.....当然这样不安全。\x0d\x0a\x0d\x0a二:在模版文件中,每个form提交域中都加上{%csrf_token%}标签,并使用render函数返回视图,或者强行使用RequestContext代替Context。例:fromdjango.shortcutsimportrenderdefcontact(request):form=ContactForm()#这里我使用了一个django的表格returnrender(request,'contact.html',{'form':form})\x0d\x0a或者:\x0d\x0afromdjango.shortcutsimportrender_to_responsedefcontact(request):form=ContactForm()#这里我使用了一个django的表格returnrender_to_response('contact.html',{'form':form},context_instance=RequestContext(request))\x0d\x0a\x0d\x0acontact.html的内容:\x0d\x0aul.errorlist{margin:0;padding:0;}.errorlistli{background-color:red;color:white;display:block;font-size:10px;margin:003px;padding:4px5px;}sendContactus{%csrf_token%}{{form.subject.errors}}工作:{{form.subject}}{{form.email.errors}}你的邮箱地址:{{form.email}}{{form.message.errors}}消息:{{form.message}}\x0d\x0a三:\x0d\x0a方法二显然只能*在django模版中使用,那如果我们使用javascript或者AJAX的时候呢?怎么添加csrf_token呢?\x0d\x0a\x0d\x0a我们可以使用javascript来提取cookies中的csrf_token。\x0d\x0a\x0d\x0afunctiongetCookie(name){varcookieValue=null;if(document.cookie&&document.cookie!=''){varcookies=document.cookie.split(';');for(vari=0;i 结语:以上就是首席CTO笔记为大家整理的关于Django中如何防止csrf的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于Django中如何防止csrf的相关内容别忘了在本站进行查找喔。