Django 安全之跨站点请求伪造(CSRF)保护 by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 跨站点请求伪造(CSRF)保护 中间件配置 默认的CSRF中间件在... 注意:如果被渲染的view视图未使用csrf_token模板标签,Django可能不会设置CSRF token cookie。...这种情况下,假如有必要,可以使用Django提供的 @ensure_csrf_cookie()装饰器强制view视图发送CSRF cookie。...from django.views.decorators.csrf import ensure_csrf_cookie @ensure_csrf_cookie() def specific_view(request...前端js脚本 注意:如果已开启CSRF 的情况下,需要给请求添加X_CSRFTOKEN 请求头,否则会报403错误 /** * 验证不需要CSRF保护的HTTP方法名(GET|HEAD|OPTIONS
具体工作流程如下: 生成Token:当用户访问一个包含表单的页面时,Django会在响应中设置一个名为csrftoken的Cookie,并且在HTML表单中插入一个隐藏字段,其值为相同的CSRF Token...验证Token:当用户提交表单时,无论是通过POST请求还是其他非安全方法(如PUT、DELETE等),Django都会检查请求中的CSRF Token是否与存储在Cookie中的Token相匹配。...只有当两者匹配时,才会处理该请求;否则,请求将被拒绝并返回403 Forbidden错误。...如果前端未正确获取或发送 CSRF Token,就会触发以下错误: CSRF verification failed. Request aborted. CSRF cookie not set....在传统的 Django 项目中,CSRF Token 通常是通过模板渲染(如 {% csrf_token %})或默认机制生成的,并存储在 Cookie 中,其中,{% csrf_token %}在我之前的所有
什么是CSRF 浏览器在发送请求的时候,会自动带上当前域名对应的cookie内容,发送给服务端,不管这个请求是来源A网站还是其它网站,只要请求的是A网站的链接,就会带上A网站的cookie。...Django是在表单中加一个隐藏的 csrfmiddlewaretoken,在提交表单的时候,会有 cookie 中的内容做比对,一致则认为正常,不一致则认为是攻击。...Django使用CsrfViewMiddleware中间件进行CSRF校验,默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有携带csrf字段,导致校验失败,报403错误。...那么我们如何解决这种403错误呢? 解决方法 1. 去掉项目的CSRF验证 ? 注释掉此段代码即可,但是不推荐此方式,将导致我们的网站完全无法防止CSRF攻击。 2....import View from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import
修改后的views.py中的完整代码为: from django.shortcuts import render # Create your views here. def index(request...import render from django.http import JsonResponse # Create your views here. def index(request):...内置的Json格式,返回给客户端数据 在CMD窗口运行client_post.py后,得到403错误,表示服务器拒绝或禁止访问。...服务器端提示的错误则是: Forbidden (CSRF cookie not set.): /mainpage [24/Aug/2018 19:39:06] "POST /mainpage HTTP/...1.1" 403 2868 将服务器端settings.py中的 'django.middleware.csrf.CsrfViewMiddleware', 注释起来 ?
为了避免上面情况的出现,Django引用了CSRF防护机制;Django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,并把这个 token 放在 cookie 里。...如果POST请求中没有token随机字符串,则返回403拒绝服务 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token...如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden。...', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',...# 保存到Session中 # 在随机字符串对应的字典中设置相关内容...
提取cookie中的csrftoken 这个cookie应该是django服务器向客户端发送的,通过它来完成csrf验证,post请求必须拿到cookie中的csrftoken然后跟着请求一起发送才行!...X-CSRFToken为空; 网上有人说,可以把后台生成的csrftoken直接赋给请求头中的 X-CSRFToken,我试了一下并不行,还是会提示403Forbidden; 所以通过csrf认证的真正方式是...:django配置好跨域允许携带cookie后,并且axios也配置好允许携带cookie,发送post请求时,Django会自动发给客户端一个cookie 我们需要把这个cookie中的csrftoken...,也就是csrftoken 可以自己试一下,如果把这个cookie删掉,发post请求就会报 403Forbidden 如果按照上述配置好的话,每次触发这个请求时,都会在这里自动生成一个cookie...,猜测是Django自动发给客户端的 然后客户端需要携带这个cookie才能提高django的csrf验证 当然,如果不按照上述配置,例如 没有配置 axios.defaults.withCredentials
Django csrf中间件 当用户访问有Django csrf中间件的服务端时Django csrf中间件会给用户的get请求的页面携带一个随机字符串,当用户发送post请求时会校验用户的随机字符串,...如果如果校验不通过则直接报403错误,禁止用户提交post请求。...csrf_exempt 不给某个视图函数加csrf校验 from django.views.decorators.csrf import csrf_exempt @csrf_exempt # 不校验...模仿使用 模仿使用其实就是模仿用户settings配置文件如果设置了就用用户的,如果没有设置就用内置的这个功能。...False,可以在不删除用户的前提下禁止用户登录。
需求 一般Django开发为了保障避免 csrf 的攻击,如果使用Django的模板渲染页面,那么则可以在请求中渲染设置一个csrftoken的cookie数据,但是如果需要前后端分离,不适用Django...” Django 通过 request 请求获取 csfttoken 的方法 from django.middleware.csrf import get_token def getToken(request...Django 后端获取 csrftoken 示例 在视图 views.py 设置 getToken 方法 from django.middleware.csrf import get_token #...我尝试过在Django中设置跨域返回的方式,但是这是不行的,因为不同的域名使用 csrftoken 就基本失去了原来的防止 csrf 攻击的意义。...,那么则会出现 403拒绝报错 如下: ?
这个就是CSRF攻击。 2、Django的CSRF插件是如何解决CSRF攻击的 下面让我们来看一下Django的CSR插件是如何解决CSRF攻击的。...Django利用了一个名为django.middleware.csrf.CsrfViewMiddleware的中间件(可以在Django的settings.py中设置)利用CSRF令牌的方式来控制。...csrftoken的cookie,这个cookie的值也是CSRF令牌的值。...的值一致,则返回200返回码,进入登录后的页面,否则返回403返回码,拒绝进入系统。...后来,我惊奇的发现不用这么麻烦,我们直接把表单csrfmiddlewaretoken的值与cookie的csrftoken值设置相同,即: csrf_token = csrf_token = "Pxpy5PDU3i1imqd0XZrK4ct6pZRIknHT48UE60GRrKtmqW7UCPq66pddXp0fzTpx
powered site via Google Analytics),通过该漏洞,当一个网站使用了Django作为Web框架并且设置了Django的CSRF防护机制,同时又使用了Google Analytics...2.漏洞影响 网站满足以下三个条件的情况下攻击者可以绕过Django的CSRF防护机制: 使用Google Analytics来做数据统计 使用Django作为Web框架 使用基于Cookie的CSRF...所以Django对于CSRF的防护就是判断cookie中的csrftoken和提交的csrfmiddlewaretoken的值是否相等。...cookie的可能,但是如何设置csrftoken的值呢?...这就用到了我们上面说的Django处理cookie的漏洞,当我们设置Referer为http://x.com/hello]csrftoken=world,GA设置的cookie如下: __utmz=123456.123456789.11.2
'注释 查看csrf1的源代码,复制,在自己的网站内建一个html文件,粘贴源码,访问查看效果 防csrf的使用 在django的模板中,提供了防止跨站攻击的方法,使用步骤如下: step1:在settings.py...中启用'django.middleware.csrf.CsrfViewMiddleware'中间件,此项在创建项目时,默认被启用 step2:在csrf1.html中添加标签 {% csrf_token...from django.views.decorators.csrf import csrf_exempt @csrf_exempt def csrf2(request): uname=request.POST...信息 本站中自动添加了cookie信息,如下图 查看跨站的信息,并没有cookie信息,即使加入上面的隐藏域代码,发现又可以访问了 结论:django的csrf不是完全的安全 当提交请求时,中间件'django.middleware.csrf.CsrfViewMiddleware...'会对提交的cookie及隐藏域的内容进行验证,如果失败则返回403错误
Django 提供的 CSRF 防护机制 django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。...在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken...字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面) 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的...如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden....在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值 Django 里如何使用 CSRF 防护: 首先,最基本的原则是
因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。 ...要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。...如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。 用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。...Django 中处理CSRF csrf是针对与post请求的才会做验证 几种处理方式 csrf_token 用于form表单中,作用是跨站请求伪造保护。...如果不用{% csrf_token %}标签,在用 form 表单时,要再次跳转页面会报403权限错误。 用了{% csrf_token %}标签,在 form 表单提交数据时,才会成功。
我们知道,当我们使用 img 等标签时,通过设置标签的 src 等属性引入外部资源,是可以被浏览器认为是合法的跨域请求,也就是说是可以带上 Cookie 访问的。...1) HTML 标签 我们知道,根据同源策略的规定,跨域请求是不允许带上 Cookie 等信息的,可是出于种种考虑最终没有进行完全禁止,即存在某些合法的跨域请求。...5) 防御实例:Django 的 CSRF 防御机制 新建个 Django 项目,打开项目下的 settings.py 文件,可以看到这么一行代码:django.middleware.csrf.CsrfViewMiddleware...这个就是 Django 的 CSRF 防御机制,当我们发送 POST 请求时 Django 会自动检测 CSRF_Token 值是否正确。...我们把Debug打开,可以看到如果我们的 POST 请求无 CSRF_Token 这个值,服务端会返回 403 报错。 ? 现在我们往表单上添加 CSRF_Token 的验证: <!
CSRF注入防护方法 1)CSRF Token技术 CSRF Token技术是在页面产生GET或POST请求之前,建立一个参数,以及一个cookie,参数的值与cookie的值是相等的,当HTTP请求传输到服务器端的时候...,服务器会检查GET或POST请求参数是否与cookie的值相等,如果相等返回200代码,否则返货403代码。...下面介绍下Django中的django.middleware.csrf.CsrfViewMiddleware的工作原理。...login_action/,否则返回403(Forbidden)响应码。...14 CSRF Token在前后端分离中的解决方案 2)其他方法 但是这个方法是防君子不防小人的,有经验的工程师可以构造接口测试代码,将cooiles的值与hidden中的值设置为一样的,然后提交,可以通过假
这个cookie的域是thoughtworks.okta.com,则只有访问thoughtworks.okta.com下的api,浏览器才会将该cookie发送至后端服务器。...这个值可以包含子域,如设置domain为okta.com时,访问thoughtworks.okta.com也会带上该cookie。...Expires/Max-Age:cookie有两种,本地cookie与session cookie。如果设置了cookie的过期时间则为本地cookie,不设置为session cookie。...这种方式可以通过设置cookie的HttpOnly为true来防止js获取cookie值。从而避免通过XSS攻击获取sessionId。 CSRF攻击叫做跨站请求伪造。...那还有什么办法可以解决CSRF攻击的问题? 我们来看下okta是如何做到解决这个问题的。
csrf 中间件 跨站请求伪造 post请求提交数据通过 csrf 校验 form 表单 ajax 发送 csrf 装饰器相关 未注释掉 csrf 中间件时 单功能取消 csrf 校验:csrf_exempt...&& document.cookie !...%} 或在 ajax 中写 {{ csrf_token }} 了 csrf 装饰器相关 其他中间件也可以效仿下面的方法来校验或者取消校验 两个问题 当你网站全局都需要校验 csrf 的时候(未注释掉...@csrf_protect 未注释掉 csrf 中间件时 单功能取消 csrf 校验:csrf_exempt FBV from django.views.decorators.csrf import...,如果没有登录,(未传参数的情况下)默认跳转到 django 自带的登录页面(还是 404 ?)
Django默认开启了csrf中间件来防御csrf攻击,所以当发送post请求时会返回403错误,而开发者访问本站点的网页时同样会返回403错误,所以在Django MVT之V中直接注释掉了csrf防御...为了防止csrf攻击,需要打开csrf中间件。(注意:默认情况下,Django已经打开) 但是开启了csrf防御后,请求本站点页面也会返回403错误,解决办法是使用csrf_token标签 <!...防御原理: 当启用中间件并加入标签csrf_token后,Django框架渲染模板文件时会在页面生成一个名字叫做csrfmiddlewaretoken的隐藏域input元素。...并且会向客户端浏览器中写入一条Cookie信息,这条信息的值与隐藏域input元素的value属性是一致的。...当post请求提交到服务器后,会先由csrf中间件进行对比验证,如果验证失败则返回403错误,而不会进行后续的处理。
其实过滤器也有非常的多,例如设置默认值: data|default:'默认值' 就是当返回的变量为空时,默认显示的值。...通过上面的图,大家可能就会知道csrf攻击的罪魁祸首就是cookie,另一个网站利用了你当前网站的cookie来进行一些恶意操作。因为另一个网站拿到你的cookie之后,就可以对你当前网站为所欲为。...在前面的文章中说到过post适用于安全性需求高的数据,所以我们主要讲讲csrf在Django的post方式时的防范姿势。...Django提供了csrf中间件用于防止CSRF攻击,只需要在settings.py中启用csrf中间件即可。 ? 但是你打开这个中间件后,你会发现访问不了自己的网站了,会出现403的警告。...我们加入csrf_token的标签后,会发现form表单中出现了一个name为csrfmiddlewaretoken的值,下图: ? 然后此时,我们再去看下cookie ?
8)Django项目中默认启用了csrf保护,现在先禁用,打开第一个项目中的mysite/settings.py文件,注释掉csrf中间件。...防止CSRF 1)Django提供了csrf中间件用于防止CSRF攻击,只需要在网站A的mysite/settings.py中启用csrf中间件即可。...在浏览器的“开发者工具”中查看cookie信息。...说明:当启用中间件并加入标签csrf_token后,会向客户端浏览器中写入一条Cookie信息,这条信息的值与隐藏域input元素的value属性是一致的,提交到服务器后会先由csrf中间件进行验证,如果对比失败则返回...403页面,而不会进行后续的处理。