我之前从未开发过 Chrome 扩展程序,目前正在为我的 Django 驱动的应用程序开发 Chrome 扩展程序(具有链接提交功能)。当我尝试使用扩展提交链接时,出现以下错误:
'POST http://127.0.0.1:8000/add_link_from_extension 403 (FORBIDDEN)'
Run Code Online (Sandbox Code Playgroud)
这可以通过在 postdata JSON 中传递 csrfmiddlewaretoken 来解决,但是,显然我做不到
<script>var csrfmiddlewaretoken = "{{ csrf_token }}"</script>
Run Code Online (Sandbox Code Playgroud)
在 Chrome 扩展程序的 html 文件中。您如何将 csrf_token 从 Django 传递到 Chrome 扩展程序的 JavaScript?或者,有没有其他方法可以解决这个问题?这是来自 Chrome 扩展程序的 JS 代码的相关部分:
postdata = {
"url":url.value
//"csrfmiddlewaretoken": csrfmiddlewaretoken
};
$.post('http://' + "127.0.0.1:8000" + '/add_link_from_extension', postdata, success);
Run Code Online (Sandbox Code Playgroud) 为了看到这个可能的错误,您需要打开两个浏览器和一些插件来获取/设置cookie.
如果你在django 1.7中创建一个新项目并访问管理站点(/admin),并在第一个broser中成功登录并获取sessionid和csrftokencookie并将它们设置到第二个浏览器登录页面并设置随机用户和密码,你将获得一个CSRF错误,如果您在浏览器中返回,则表示您已登录.
怎么能避免这个?
我尝试为我的模型添加 ModelForm,但每次 POST 尝试都以“403 Forbidden。CSRF 验证失败。请求中止。失败原因给出:CSRF 令牌丢失或不正确”。我没有 render_to_response() 方法,所以我不能通过添加 RequestContext 来解决这个问题。这是我的模型:
from django.db import models
from django.forms import ModelForm
.
.
.
class Text(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
def __str__(self):
return self.title
class TextForm(ModelForm):
class Meta:
model = Text
fields = '__all__'
Run Code Online (Sandbox Code Playgroud)
这是我的views.py:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Text, TextForm
.
.
.
def text_new(request):
if request.method == 'POST':
form = TextForm(request.POST)
if form.is_valid():
return HttpResponse('Test')
else:
form = TextForm()
return …Run Code Online (Sandbox Code Playgroud) 我有一个 Django 应用程序,主要在 domain.com 下提供服务,但也在其他域下(主要用于测试)。我还有一个单独的子域,为用户提供 Web 应用程序客户端代码。
API 的主域是api.domain.com,并且应用程序正在部署到apps.domain.com. 登台服务器不在同一个域名下;他们住在stagingX.otherdomain.com. 这是我无法控制的。
我遇到的问题是当我尝试从apps.domain.com以下位置登录时遇到 CSRF 失败:
Failed to load resource: the server responded with a status of 403 (OK)
login error: "CSRF Failed: Referer checking failed - http://apps.domain.com/ does not match https://api.domain.com/."
Run Code Online (Sandbox Code Playgroud)
这一个简单的世界,我会简单地设置CSRF_COOKIE_DOMAIN于*.domain.com和完成。但是,这完全破坏了我在部署之前暂存代码的能力,因为直接访问 APIstagingX.otherdomain.com也需要适用于需要运行的不同测试。
任何人都可以启发我我应该如何设置它?我正在后悔决定将应用程序部署到单独的服务器的那一天,但由于其他原因,应用程序部署和 API 部署应该分开......这让我发疯。
提前致谢。
-- 编辑以添加其他信息 --
对于它的价值,我也在使用 CORS 保护。在这种情况下,看起来我可能应该使用某种 CORS 标头而不是 CSRF,但我对 CORS 机制的了解不够充分,无法了解这是否是解决方案所在。我确实已apps.domain.com列入白名单,但这不适用于登录,也可能不适用于其他端点(无法通过登录来检查其他端点)。
Django模板允许您包括其他模板来构成页面。当您要渲染整个页面,但又想使用AJAX重新加载页面的一部分,又不想将所有渲染逻辑都移到javascript中(或更糟糕的是,在javascript中复制它)时,这特别有用。
包括模板如下所示:
{% include "template.html" %}
Run Code Online (Sandbox Code Playgroud)
但是,如果该模板可能被其他视图使用,则您的上下文很可能不仅仅是该模板的上下文的超集。因此,Django也允许您指定模板的上下文。
因为我想避免当模板被包含在另一个模板中而被渲染时以及模板被渲染为视图的主要模板时意外引入不同的行为,所以使用该only选项以避免访问该模板也很有意义。父模板的上下文。
所以我的包含看起来像这样:
{% include "sub_template.html" foo=sub_context.foo bar=sub_context.bar only %}
Run Code Online (Sandbox Code Playgroud)
但是,添加only会导致问题:{% csrf_token %}在该模板中不再起作用,因为我猜想Django所做的一些隐藏的魔术已被排除在外。
Django记录的错误是
UserWarning:在模板中使用了{%csrf_token%},但上下文未提供该值。这通常是由于未使用RequestContext引起的。
父模板被渲染用RequestContext,并且当所述子模板呈现为所述主模板,不包括在内,不会发生错误。
解决此问题的最明显方法是不使用onlyto 的选项include,这似乎很可惜。有解决此问题的更好方法吗?
如何找出谁负责Django的CSRF中间件,以便我可以问他们问题?
在我的Django网站上,我有几个月的CSRF失败,每隔几周就要花费数小时的时间来解决问题.我想联系那些参与其中的开发人员,向他们询问一两个关于我遇到的问题的根本问题.
我提出了几个关于那些从来没有得到满意答案的问题的帖子,但这确实导致了一些解决方法:
Django CSRF框架无法被禁用并且正在破坏我的网站
Django CSRF框架有很多失败
来自Django的CSRF中间件的大量误报?
对于Django的CSRF故障中间件,如何报告CSRF错误以报告哪些URL失败?
其他一些人也有同样的挫折感:
在SVN Trunk中完全禁用Django的CSRF保护
我有一个简单的表单,我希望用户能够登录; 这里是带有CSRF标签的模板代码:
<html>
<head><title>My Site</title></head>
<body>
<form action="" method="post">{% csrf_token %}
<label for="username">User name:</label>
<input type="text" name="username" value="" id="username">
<label for="password">Password:</label>
<input type="password" name="password" value="" id="password">
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next|escape }}" />
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在这是我的views.py页面.问题是我在哪里放入CSRF支持部分(现在我得到CFRS令牌错误),我该怎么做?
from django.contrib import auth
def login_view(request):
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None and user.is_active:
# Correct password, and the user is marked "active"
auth.login(request, user)
# Redirect to …Run Code Online (Sandbox Code Playgroud) 我的大部分GET请求都是由Angular触发的,这样可以很容易地在头文件中设置CSRF令牌.这已经开箱即用于POST请求,但是我想知道我是否也可以对GET请求使用CSRF保护.
我最初的直觉是@csrf_protect在View的get方法之前添加,例如:
class ProjectView(View):
@csrf_protect
def get(self, request, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)
但是这会产生错误:
AttributeError at /project
'ProjectView' object has no attribute 'COOKIES'
File "c:\Apps\msysgit\simpletask\lib\site-packages\django\middleware\csrf.py" in process_view
95. request.COOKIES[settings.CSRF_COOKIE_NAME])
Run Code Online (Sandbox Code Playgroud)
所以我猜测有一些POST请求提供了哪些GET请求没有.有一个更好的方法吗?
此外,在任何人提到应该通过POST请求提取所有敏感信息之前(我最近已经看过几次),我试图坚持使用GET的原因是我正在尝试根据RESTful指南构建,这意味着GET请求用于提取数据,POST用于新记录,PUT用于更新,DELETE用于删除数据.
编辑:
由于似乎有一种情绪我不应该尝试上述内容,而我现在确实有点同意,我试图阻止的漏洞在这三个链接中讨论:
让我解释一下我在做什么?
我在浏览器上打开了两个标签,显示了我的登录页面(简单的用户名和密码表单).
使用选项卡1:我登录时提供正确的凭据.工作正常.
使用选项卡2 :(不刷新)我再次尝试使用相同或不同的凭据登录,这会引发403禁止错误失败原因:CSRF令牌丢失或不正确.
我知道,我正在做一些愚蠢的事情,当我已经登录时,我正在尝试登录.
我想防止引发的脏403错误并使进程顺利,因为当有人已经登录或其他不会破坏流程时,应该忽略第二个登录请求.我该怎么做呢?
我正在使用Django == 1.6.2和django-allauth == 0.14.1
我是jMeter测试的新手.我想在UI上测试字段更新.因此,当我运行测试时,我收到了CSRF验证错误.我该如何解决这个问题.我的测试计划看起来像,

取样器结果如下,
Thread Name: Thread Group 1-1
Sample Start: 2014-11-18 23:37:49 IST
Load time: 688
Latency: 688
Size in bytes: 483
Headers size in bytes: 457
Body size in bytes: 26
Sample Count: 1
Error Count: 1
Response code: 401
Response message: Unauthorized : CSRF validation failed
Response headers:
HTTP/1.1 401 Unauthorized : CSRF validation failed
Date: Tue, 18 Nov 2014 18:08:07 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.5
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 18 Nov 2014 …Run Code Online (Sandbox Code Playgroud) django-csrf ×10
django ×8
csrf ×3
python ×3
api ×1
cookies ×1
django-1.5 ×1
django-forms ×1
django-views ×1
http-post ×1
jmeter ×1
python-2.7 ×1