当前位置: 首页 > 网络应用技术

Django后端CSRF如何攻击?

时间:2023-03-08 02:01:16 网络应用技术

  简介:今天,首席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攻击方式的详细信息,不要忘记在此站点上找到它。