问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django如何csrf机制(django中csrf的实现机制)

发布网友 发布时间:2024-09-09 15:25

我来回答

1个回答

热心网友 时间:2024-09-24 20:25

导读:今天首席CTO笔记来给各位分享关于django如何csrf机制的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

当我用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_token的了解

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解决方案:

如何在Django使用ajax的POST

post方式不同于get方式可以被django直接得到,因为django为post加入了csrf保护,详细的文档地址

注释:在最新版本中,在setting.py里'django.middleware.csrf.CsrfViewMiddleware',默认是使用中的,如果没有请自行添加,并且确保此引用在其他所有viewware前面

MIDDLEWARE_CLASSES=(

'django.contrib.sessions.middleware.SessionMiddleware',

'django.middleware.common.CommonMiddleware',

'django.middleware.csrf.CsrfViewMiddleware',//thislineisvsrf

'django.contrib.auth.middleware.AuthenticationMiddleware',

'django_cas.middleware.CASMiddleware',

'django.contrib.auth.middleware.SessionAuthenticationMiddleware',

'django.contrib.messages.middleware.MessageMiddleware',

'django.middleware.clickjacking.XFrameOptionsMiddleware',

)

如果想避过csrf检测这一层直接使用post的话,有几种方法:

1需要在views.py里要出发post请求的函数前加入@csrf_exempt,之前要引入fromdjango.views.decorators.csrfimportcsrf_exempt

2在settings.py中MIDDLEWARE_CLASSES中注释掉'django.middleware.csrf.CsrfViewMiddleware'

说下正确使用csrf的方法:

对于ajax.post方法,需要在ajax方法触发前加入一段js,这段我理解是用来生成不同的token,但是很好奇如果禁掉了co

各位是怎么解决django的防csrf

djangopost出现403的解决办法据说,从django1.x开始,加入了CSRF保护。

CSRF(Cross-siterequestforgery跨站请求伪造,也被称成为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。-------来自百度百科

报错:Forbidden(403)

CSRFverificationfailed.Requestaborted.Help

Reasongivenforfailure:CSRFtokenmissingorincorrect.

Ingeneral,thiscanoccurwhenthereisagenuineCrossSiteRequestForgery,orwhenDjango'sCSRFmechanismhasnotbeenusedcorrectly.ForPOSTforms,youneedtoensure:

Yourbrowserisacceptingcookies.

TheviewfunctionusesRequestContextforthetemplate,insteadofContext.

Inthetemplate,thereisa{%csrf_token%}templatetaginsideeachPOSTformthattargetsaninternalURL.

IfyouarenotusingCsrfViewMiddleware,thenyoumustusecsrf_protectonanyviewsthatusethecsrf_tokentemplatetag,aswellasthosethatacceptthePOSTdata.

You'reseeingthehelpsectionofthispagebecauseyouhaveDEBUG=TrueinyourDjangosettingsfile.ChangethattoFalse,andonlytheinitialerrormessagewillbedisplayed.

YoucancustomizethispageusingtheCSRF_FAILURE_VIEWsetting.

在网上找解决办法,说是提交参数中要有csrf_token,才能成功。但网上都是1.3或者1.4版本的解决办法,在1.5版本中测试已经不能用了。

在1.5.1版本,我测试可行的解决办法有三种:

一:

关闭csrf保护功能。为视图函数添加@csrf_exempt修饰符。

fromdjango.views.decorators.csrfimportcsrf_exempt@csrf_exemptdefview(request):#yourcode.....当然这样不安全。

二:在模版文件中,每个form提交域中都加上{%csrf_token%}标签,并使用render函数返回视图,或者强行使用RequestContext代替Context。例:fromdjango.shortcutsimportrenderdefcontact(request):form=ContactForm()#这里我使用了一个django的表格returnrender(request,'contact.html',{'form':form})

或者:

fromdjango.shortcutsimportrender_to_responsedefcontact(request):form=ContactForm()#这里我使用了一个django的表格returnrender_to_response('contact.html',{'form':form},context_instance=RequestContext(request))

contact.html的内容:

htmlheadstyletype="text/css"ul.errorlist{margin:0;padding:0;}.errorlistli{background-color:red;color:white;display:block;font-size:10px;margin:003px;padding:4px5px;}/styletitlesend/title/headbodyh1Contactus/h1formaction=""method="post"{%csrf_token%}divclass="field"{{form.subject.errors}}labelfor="id_subject"工作:/label{{form.subject}}/divdivclass="field"{{form.email.errors}}labelfor="id_email"你的邮箱地址:/label{{form.email}}/divdivclass="field"{{form.message.errors}}labelfor="id_message"消息:/label{{form.message}}/divinputtype="submit"value="Submit"/form/body/html

三:

方法二显然只能限制在django模版中使用,那如果我们使用javascript或者AJAX的时候呢?怎么添加csrf_token呢?

我们可以使用javascript来提取cookies中的csrf_token。

functiongetCookie(name){varcookieValue=null;if(document.cookiedocument.cookie!=''){varcookies=document.cookie.split(';');for(vari=0;icookies.length;i++){varcookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}returncookieValue;}

或者这个好理解的:

functiongetCookie(sName){varaCookie=document.cookie.split(";");for(vari=0;iaCookie.length;i++){varaCrumb=aCookie[i].split("=");if(sName==aCrumb[0])return(aCrumb[1]);}returnnull;}

AJAX中这样用:$.post(url,{"csrfmiddlewaretoken":getCookie('csrftoken')},function(data){alert(data);});

但是有一个问题,当有一个新用户访问这个页面的时候,cookie里并没有csrftoken这个值。只有进行第二种方法,才能在cookie里生成csrftoken值。解决此问题的方法随后更新。

完全可以满足简单的建站需要。

求助django实现前端页面检索功能的代码

设我们的django博客应用有如下的文章模型:

blog/models.pyclassPost(models.Model):

#标题

title=models.CharField(max_length=70)

#正文

body=models.TextField()

#其他属性

def__str__(self):

returnself.title

先看到第1步,用户在搜索框输入搜索关键词,因此我们要在博客上为用户提供一个搜索表单,html表单代码大概像这样:

formmethod="get"action="/search/"

{%csrf_token%}inputtype="search"placeholder="搜索"required

buttontype="submit"搜索/button/form

特别注意在form标签下有一个{%csrf_token%},这是django用来防御跨站请求伪造(CSRF)攻击的机制。如果不知道什么是CSRF的话也没有关系,只要记住在使用django时,前端的表单代码里一定要加上{%csrf_token%}。

用户输入了搜索关键词并点击了搜索按钮后,数据就被发送给了django后台服务器。表单的action属性的值为/search/,表明用户提交的结果将被发送给/search/这个URL。我们为这个URL绑定一个django视图函数,在这个视图函数里完成前面第2步提到的过程。假设我们把视图函数的代码写在blog/views.py里:

blog/views.pydefsearch(request):

q=request.GET.get('q')

error_msg=''

ifnotq:

error_msg='请输入关键词'

returnrender(request,'blog/errors.html',{'error_msg':error_msg})

post_list=Post.objects.filter(title__icontains=q)

returnrender(request,'blog/results.html',{'error_msg':error_msg,

'post_list':post_list})

首先我们使用request.GET.get('q')获取到用户提交的搜索关键词。用户通过表单提交的数据django为我们保存在request.GET里,这是一个类似于Python字典的对象,所以我们使用get方法从字典里取出键q对应的值,即用户的搜索关键词。这里字典的键之所以叫q是因为我们的表单中搜索框input的name属性的值是q,如果修改了name属性的值,那么这个键的名称也要相应修改。

接下来我们做了一个小小的校验,如果用户没有输入搜索关键词而提交了表单,我们就无需执行查询,而是渲染一个错误页面提示用户请输入关键词。

如果用户输入了搜索关键词,我们就通过filter方法从数据库里过滤出符合条件的所有文章。这里的过滤条件是title__icontains=q,即title中包含(contains)关键字q,前缀i表示不区分大小写。这里icontains是查询表达式(Fieldlookups),其用法是在模型需要筛选的属性后面跟上两个下划线。django内置了很多查询表达式,建议过一遍django官方留个印象,了解每个表达式的作用,以后碰到相关的需求就可以快速定位到文档查询其用途:Fieldlookups

接下来就是渲染搜索结果页面,显示符合搜索条件的文章列表,下面是一个模板的简单示例:

results.html

{%iferror_msg%}p{{error_msg}}/p{%endif%}

{%forpostinpost_list%}div

在这里显示文章的相应信息/div{%empty%}divclass="no-post"

没有搜索到符合条件的文章/div{%endfor%}

有了视图函数后记得把视图函数映射到相应了URL,前面我们表单数据提交的URL为/search/,因此将视图函数search绑定到该URL上。

blog/urls.pyurlpatterns=[

#其他url配置

url(r'^search/$',views.search,name='search'),]

大功告成!

结语:以上就是首席CTO笔记为大家整理的关于django如何csrf机制的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
U盘更新专用需要电脑打开怎么让我的U盘和电脑文件夹同步更新啊_百度知 ... 为什么我的硬盘一打开就弹出对话框说选择打开方式. 倒霉的是右键也打... 磁盘右键是打开方式怎么办 我双机盘符总是打开 打开方式 让我选择,右健第一项是打开.不知道是中了... 罗技Lightspeed怎么用? 罗技无线鼠标怎么样?怎么连接电脑使用? 为什么不建议去融资公司上班 融资担保公司一般账务处理及所涉及的会计科目有哪些 月经期间可以游泳吗 经期能不能游泳 ...查看 已经获取到数据Uncaught SyntaxError: Unexpected token... 第三代社保卡能用了吗 跨平台Axios服务封装,支持后端多种微服务对接 绣球花冬天能在外面过冬吗,冬天怎么养 哺乳期发烧怎么办还能喂孩子 今年昆三中高中录取分数线是多少? 强制执行会执行第三代社保卡吗 昆三中今年高中录取分大概会是多少? 哺乳期发烧了能吃药吗 昆明最好的高中是哪一所?近年来的录取分是多少?谢谢 青岛好乐迪KTV在哪 在汽车东站怎么坐车!平常价格和过年价格分别是多少... 青岛台东大家乐KTV具体位置在哪?夜猫的话大概多少钱 哺乳期发烧了还能继续喂奶吗?因为我反复发烧了四天了老不好,想去检查... 揭秘各种玄学预测术根源【真传一句话,假传万卷书】-5 一到夏天手臂就痒是怎么回事 猪的人工授精的技术要点 玄学小知识课堂 算命的让我把自己手指甲头发用黄包一起立春时候烧了扔进河里,是什么意... 手臂很痒抓后一粒粒凸起 手臂痒是怎么回事 耳再造的口角成型术禁忌 感冒了就没有味觉是怎么回事 包头的国企有哪些 包头市国企有哪些 LUNA!再见! 做空luna是什么意思? 包头有哪些外企 游戏史前埃及怎么和其他部落成为朋友 包头市哪些企业 看到币圈滚仓大法有心脏狂跳的感觉 内蒙古有哪些国企 有哪些可以免费观看的动漫软件? 揭开史前埃及的真实面貌,当时的人类如何生活? 请问有《史前埃及》英文硬盘版游戏免费百度云资源吗 史前埃及手游如何下载 绣球为什么只长叶子不长花苞 springMVC的@responsebody 如果不返回数据,怎么跳转页面 springmvc可以不返回页面吗 蒜泥野麻菜怎么做好吃又简单? ps怎么去除施工水印ps消除水印视频教程