CSRF-verification-failed-Request-aborted
About the CSRF_Token (From Django Official Document) The CSRF middleware and template tag provides easy-to-use protection against Cross Site Request Forgeries. This type of attack occurs when a malici
目录4 个章节
About the CSRF_Token
(From Django Official Document)
The CSRF middleware and template tag provides easy-to-use protection against Cross Site Request Forgeries. This type of attack occurs when a malicious website contains a link, a form button or some JavaScript that is intended to perform some action on your website, using the credentials of a logged-in user who visits the malicious site in their browser. A related type of attack, ‘login CSRF’, where an attacking site tricks a user’s browser into logging into a site with someone else’s credentials, is also covered.
The first defense against CSRF attacks is to ensure that GET requests (and other ‘safe’ methods, as defined by RFC 7231#section-4.2.1) are side effect free. Requests via ‘unsafe’ methods, such as POST, PUT, and DELETE, can then be protected by following the steps below.
错误
根据官方文档的说明,我在需要使用POST提交的表单里添加csrf_token即可,然而,还是出现了这个问题,又多看了几遍文档,发现没有错误,然后到谷歌一搜,才发现是模版渲染的问题。
最近看的这本《Django的16堂课》真是害人不浅啊,按照里面的写法问题多多,太坑了。
解决
原本的写法是先用get_template函数获取一个模版对象,然后在render渲染成html,问题就是出在这里,这种方式渲染的html,并不会把加入csrf_token!
使用官方文档里介绍的django.shortcuts.render就没有这个问题。
顺手贴上官方代码
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'name.html', {'form': form})
name.html
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
再附上官方对于伪造跨站访问请求保护的说明 Forms and Cross Site Request Forgery protection
Django ships with an easy-to-use protection against Cross Site Request Forgeries. When submitting a form via
POSTwith CSRF protection enabled you must use thecsrf_tokentemplate tag as in the preceding example. However, since CSRF protection is not directly tied to forms in templates, this tag is omitted from the following examples in this document.
_EOF_
CSRF-verification-failed-Request-aborted
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
解决Django使用Jinja2模版引擎之后admin无法访问的问题
需要两个文件 说明:这两个文件放在哪里都是ok,但是要记住路径,待会配置的时候需要输入。 建议放在和settings.py同个目录下面。 创建backends.py文件: import sys from django.template.backends import jinja2 as jinja2backend from django.template.backends.utils impor
2022-05-27 · 0_Django开发常见问题 · 约 1 分钟
Django与Vue.js模板语法冲突问题的解决
问题 django模板与vue.js的变量都是使用 {{ 和 }} 包裹起来的,在渲染django模板时会先替代掉所有的 {{ 和 }}及被包裹在其中的内容,使得vue.js没办法用 {{ 和 }}来绑定变量。 解决方法 方法1:修改vue.js的默认的绑定符号 在Vue App创建时配置 let app = new Vue({ delimiters: [[[, ]]], el: '#vu
2022-08-26 · 0_Django开发常见问题 · 约 1 分钟
开始开发一个新博客了,复古风Metro风格,顺便diss一下js
emmm 我原本的博客是用wordpress搭建的,当年七牛云还是免费时用它做的CDN,但是现在收费了,如果维持目前的博客流量的话每个月都要支付不少费用,于是只好把七牛云给停了= =,这也导致我博客里面很多图片都访问不了,页面布局也出问题了,不想折腾了,而且wordpress用起来总觉得不顺手,还是自己做一个吧~ 计划 最近刚好在学SpringBoot啥的,本来想用springboot搭建一个博客
2022-07-18 · Web前端 · 约 1 分钟
第一次用矮轴键盘,黑爵AK832Pro开箱评测
便携?呵,黑爵AK832Pro轻得能盖笔记本,结果小屏幕时间错得离谱,驱动也改不了。手感?薄膜键盘都不如,杂音一堆,劝退了。
2025-10-28 · 键盘 · 约 1 分钟
讨论
共 0 条加载评论中…