简介:今天,首席CTO笔记将与您分享CSRF对Django后端的攻击方式。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
CSRF_Token在Django中编写表单时的作用:
Django下的CSRF预防机制
CSRF预防机制
CSRF的防御可以从服务器和客户端启动。从服务到服务,防御效果更好。现在,一般的CSRF防御也可以在服务器上执行。
令牌防御的总体想法是:
步骤1:后端随机生成一个令牌,并将此令牌保存在会话状态。同时,后端将把这个令牌放在首页上。
步骤2:当前端需要启动请求(例如发布)时,将此令牌添加到请求数据或头部信息中,然后将其传递到后端;
步骤3:后端验证前端请求是否一致的令牌和会话是一致的;
1. Django下的CSRF预防机制
当Django首次响应客户端的请求时,将在服务器端随机生成一个令牌,并将其放置在cookie中。
这可以避免受到CSRF的攻击。
在Templete中,将{%CSRF_Token%}标记添加到每个帖子表单中。
在HTTP响应的曲奇中,Django将为您添加一个CSRFTKOKN字段,该值是自动令牌令牌
在所有帖子模板中,添加一个{%csrf_token%}标签,其功能是添加隐藏的输入标签以形式,如下所示
而且此csrf_token = cookie.csrftoken,有上下文['csrf_token'] = request.cookies ['csrtoken']当呈现模板['csrtoken']时
通过表单将帖子发送到服务器时,该表单包含隐藏在其上隐藏的输入项上的输入项。服务器收到它后,Django将在此请求中验证cookie中csrftkoken字段的值以及表单中的csrfmiddletken字段的值。如果是相同的,则表示这是法律请求,否则,此请求可能来自其他人的CSRF攻击,并退回403禁止。
当通过AJAX向服务器发送帖子请求时,需要添加X-CSRFTOKEN标头。值是cookie中csrftoken的值。收到服务湍流后,Django将验证该请求中的CSRFTOKEN字段,并且AJAX邮政消息标题X-CSRFTKEN标头是相同的。如果相同,则表明这是法律请求
具体实施方法
Django已完成供用户完成伪造的交叉点请求,并通过django.middle.csrf.csrf.csrfviewmiddleware.for Django,反cross -cross -site请求伪造功能分为全球和本地。
全球的:
中间件django.middleware.csrf.csrfviewmiddleware
当地的:
@csrf_protect,即使在设置中没有全局中间件,也强行设置了当前功能的fake -cross -stoite请求。
@csrf_exempt,即使设置中有全局中间件,取消当前功能抗-cross -Cross -site请求伪造功能。
注意:来自django.views.decocotors.csrf导入csrf_exempt,csrf_protect
1.原则
将csrftoken添加到客户端页面,验证服务器,并由服务器验证的工作由'django.middleware.csrfviewmiddleware..csrfviewmiddleware..ine完成,这有两种捍卫Django中CSRF攻击的方法:
1.以形式添加csrftoken
2.将X-CSRFTKEN请求头添加到请求请求。
注意:Django默认情况下对所有帖子请求进行了CSRFTKOOK验证。如果验证失败,则403错误等待。
django套装在cookie中
VUE发送职位403:CSRF失败:CSRF代币任务或不正确的解决方案:
早些时候,我介绍了SSRF攻击,XSS攻击和SQL注入攻击的原理和预防方法。在本文中,我将介绍CSRF Attack-Cross站点伪造的伪造。那么CSRF攻击是什么?什么是预防方法?有关特定内容,请参见下文。
CSRF攻击是什么?
CSRF,整个战斗是跨站点伪造的,也称为一键式攻击或会议
骑行,中文名称是伪造的交叉站点请求。从一开始,攻击者发送了命令网站接受目标网站,以接受目标网站的命令,以通过用户的浏览器请求执行命令。通常用于窃取帐户,转移,发送虚假新闻等。
攻击者使用网站的验证漏洞来实现此类攻击行为。该网站可以确认该请求来自用户的浏览器,但无法验证请求是否衍生了用户真实意愿的操作行为。
CSRF攻击预防方法是什么?
首先,验证HTTP参考器字段
HTTP Head中的Referer字段记录了HTTP请求的源地址。在正常情况下,访问有限限制页面的请求来自同一网站,如果黑客想实施CSRF攻击,他通常只能因此,您可以通过验证推荐人值来捍卫CSRF攻击。
其次,使用验证代码
关键操作页面加上验证代码。收到请求后,收到请求后可以防御验证代码。但是,此方法对用户不友好。
第三,将令牌添加到请求地址并验证
CSRF攻击成功的原因是黑客可以完全构成用户的请求。请求中的所有用户验证信息都存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接使用用户自己的cookie。通过安全验证。要抵制CSRF,关键是将黑客无法在请求中伪造的信息放置,并且该信息不存在于cookie中。您可以以参数的形式向HTTP请求中添加随机令牌,并在服务器上创建拦截器以验证该令牌。如果“请求”方法中没有令牌或令牌,则比检查转介更安全。可以在用户登录并放入会话后生成令牌,然后从会话中获取每个请求中的令牌,以将其与请求中的令牌进行比较,但是此方法的困难是如何将令牌添加到在请求中的请求参数的形式。
对于GET请求,令牌将附加到请求地址,以便URL成为:
对于发布请求,将输入添加到表单的最终
type =“隐藏”名称=“ csrftoken” value =“ tokenvalue” //,以便以参数形式添加到请求中的令牌。
第四,HTTP头中的自定义属性并验证
该方法还使用令牌和验证。与以前的方法不同,并不是说令牌不是以参数的形式放置在HTTP请求中,而是将其放置在HTTP Head的自定义属性中。通过XMLHTTPRequest类,您可以添加HTTP Head属性一次对所有索赔,并将令牌值放入其中。这解决了在请求中向请求中添加令牌的不便;同时,通过XMLHTTPREQUEST请求的请求不会记录到浏览器的地址栏,也不必担心通过引用的代币泄漏到其他网站。
CSRF攻击,全名是“跨站点请求伪造”。中文名称是通过跨站点请求伪造的,也称为“一点击攻击”或“会话骑行”。通常将其缩写为CSRF或XSRF.USE。
XSS主要在网站中使用Trust用户,而CSRF通过掩盖了受信任用户的请求。Compariestaked XSS,CSRF更危险。
如何捍卫CSRF攻击?
1.重要的数据交互是通过POST接受的。当然,邮政不是灵丹妙药。可以通过伪造表单来解决。
2.使用验证代码,只要它涉及数据交互,验证代码验证是先进的,该方法可以完全求解CSRF。
3.对于用户体验考虑,网站不能向所有操作添加验证代码,因此验证代码只能用作辅助手段,并且不能用作主要解决方案。
4.验证HTTP参考器字段。此字段记录HTTP请求的源地址。最常见的应用是防盗链。
5.将令牌添加到每个表单并验证。
关于国防CSRF在互联网上的攻击有许多文章,这是相同的。有三种主要方法:
第二种方法主要是通过形式中隐藏的csrf_token。该方法适用于页面渲染页面,该页面不适用于前后的分离。
对于前后端的分离,我有两种方式。
浏览器通过JavaScript在cookie中读取CSRF_Token,然后在发送请求时将其作为自定义HTTP标头发送回。
与Cookie中的CSRF_Token相比,服务器在HTTP头部读取CSRF_Token,并一致发布,否则将被拒绝。
为什么这种方法可以捍卫CSRF攻击?
关键是JavaScript在cookie中读取了csrf_token的步骤。
Django Post的解决方案为403。据说从Django1.x中添加了CSRF保护。
CSRF(跨站点请求伪造的跨站点请求伪造,也称为“一次点击攻击”或骑行,通常被缩写为CSRF或XSRF,这是对网站的恶意使用。尽管听起来像是跨站点脚本(XSS),但它与XSS大不相同,并且攻击方法几乎留在左侧。XSS使用网站中的信任用户,而CSRF使用受信任用户的请求使用Comouflage的信任网站。与之相比。XSS攻击,CSRF攻击通常经常攻击攻击。并不是很受欢迎(因此,预防的资源非常稀缺),也难以防止它,因此被认为比XSS更危险。
错误:禁止(403)
CSRF序言失败了。请求中止
失败的原因:CSRF代币任务或不正确。
通常,当有Geenuine Cross Site请求伪造或Django的CSRF机制之前,这可能会发生这种情况。对于帖子表格,您需要诱使:
您的浏览器正在访问cookie。
视图函数使用模板而不是上下文使用RequestContext。
在模板中,每个针对内部URL的帖子表单中都有一个{%CSRF_Token%}模板标签。
如果您不使用CSRFViewMiddleware,则必须在使用CSRF_Token Template标签的任何视图上使用CSRF_PROTECT,作为接受时间的一个。
您正在查看此页面的帮助部分,因为您在Django设置文件中debug = true。将其更改为false,只有初始错误消息才会潜水。
您可以使用CSRF_FAILURE_VIEW设置来汇总此页面。
在线查找解决方案,说提交参数中必须有CSRF_Token才能成功。但是Internet是1.3或1.4版本的解决方案,可以在1.5版中使用。
在1.5.1版中,可行解决方案有三种类型:
一:
关闭CSRF Protection函数。ADD@CSRF_EXEMPT修饰符至视图功能。
来自django.views.decorators.csrf导入csrf_exempt@csrf_exemptdef视图(请求):#your代码...当然不要那么安全。
二:在模板文件中,每个表单提交域都添加了{%csrf_token%}标签,并使用渲染函数返回视图,或强行使用requestContext代替contect.example.example:from Django.shortcuts import renderdef联系(请求replect RenderDef Contact(请求)):form = contactform()#here i使用django表返回渲染(请求,'contact.html',{'form':form})
或者:
content.html内容:
htmlheadstyle type =“ text/css” ul.errorlist {margin:0;填充:0;} .Errorlist li {background-color:red;白颜色;显示:块;;填充:4px 5px;}/style titlesend/headbody h1contact us/h1 form action =“ method =”}/div class =“ field” {{form.email.errrs}}} babel for =“ id_email”:/label {form.email}}/div div class =“ field” field'field'field.message.error}}} labelfor =“ id_message”消息: /label {{form.message} /div Input type =“ submit” value =“ submit” / /form /form /form /hody /html
三:
方法2显然只能在Django模板中受到限制。如果我们使用JavaScript或Ajax怎么办?如何添加CSRF_Token怎么办?
我们可以使用JavaScript在cookie中提取CSRF_Token。
;i ++){var cookies = jquery.trim(cookies [i]);if(cookie.substring(0,name.length + 1)==(name +'=')){cookievalue =解码(cookinenenenenenenenenenenenenenenenenentname.length + 1)));break;}}}返回cookievalue;}
否则这很容易理解:
函数getCookie(name){var ancookie = document.cookie.split(“;”);for(var i = 0; iacookie.length; i ++){var ancrumbie [i] .split(“ =”);if(name == acrumb [0])返回(acrumb [1]);} return null;}
在ajax:$ .post(url,{“ csrfmiddletoken”:getCookie('csrftoken')},function(data){alert(data);});
但有一个问题。当有新用户访问此页面时,cookie中没有CSRFTOKEN。仅通过执行第二种方法可以在cookie中生成CSRFTOKEN值。解决此问题的方法然后进行更新。
它可以完全满足简单电台的需求。
您需要在表单后面添加csrf_token。
表单方法=“ post” {%csrf_token%}
xxx
/形式
或修改DJANGO源代码:django/mideware/csrf.py proces_view
在“#如果用户没有CSRF cookie”上添加以下代码:
如果request.path.startswith('/admin'):
返回接受()
如果Django版本为1.2.5,则修改了修改:
如果request.path.startswith('/admin'):
返回self._accept(请求)
这意味着请求URL是/admin,即使表格背后没有CSRF_Token,您也可以访问它。
结论:以上是首席CTO注释的所有内容,所有人都为Django的后端CSRF攻击汇编了所有人。感谢您阅读本网站的内容。我希望这对您有帮助。关于Django的后端CSRF攻击方式的详细信息,不要忘记在此站点上找到它。