我知道有关于Django Rest Framework的答案,但我无法找到解决问题的方法.
我有一个具有身份验证和一些功能的应用程序.我添加了一个新的应用程序,它使用Django Rest Framework.我想只在这个应用程序中使用该库.我也想发出POST请求,我总是收到这个回复:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
Run Code Online (Sandbox Code Playgroud)
我有以下代码:
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
url(r'^object/$', views.Object.as_view()),
)
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
class Object(APIView):
@csrf_exempt
def post(self, request, format=None):
return Response({'received data': request.data})
Run Code Online (Sandbox Code Playgroud)
我想添加API而不影响当前的应用程序.所以我的问题是如何才能为此应用禁用CSRF?
帮助
\n失败原因给出:
\nOrigin checking failed - https://praktikum6.jhoncena.repl.co does not match any trusted origins.\nRun Code Online (Sandbox Code Playgroud)\n一般来说,当存在真正的跨站请求伪造时,或者当 Django\xe2\x80\x99s CSRF 机制未正确使用时,就会发生这种情况。对于 POST 表单,您需要确保:
\nYour browser is accepting cookies.\nThe view function passes a request to the template\xe2\x80\x99s render method.\nIn the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.\nIf you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those …Run Code Online (Sandbox Code Playgroud) 我尝试发布参数
jQuery.ajax(
{
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': "{content:'xxx'}",
'dataType': 'json',
'success': rateReviewResult
}
);
Run Code Online (Sandbox Code Playgroud)
但是,Django返回Forbidden 403. CSRF verification failed. Request aborted.
我正在使用,'django.middleware.csrf.CsrfViewMiddleware'并且无法在不影响安全性的情况下找到如何防止此问题.
我正在使用curl测试我的一个Django表单.我尝试过的调用(每个调用都有错误,多行可读):
(1):
curl
-d "{\"email\":\"test@test.com\"}"
--header "X-CSRFToken: [triple checked value from the source code of a page I already loaded from my Django app]"
--cookie "csrftoken=[same csrf value as above]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(使用http标头和csrftokencookie)导致400错误,没有返回数据.
(2):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
--cookie "csrftoken=[as above];sessionid=[from header inspection in Chrome]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(如在(1)中但在头属性声明中没有空格,并且sessionid在cookie中也没有空格)导致相同的400错误而没有返回数据.
(3):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(只有http标头X-CSRFToken,没有cookie)会导致错误代码403,并显示消息:未设置CSRF cookie.
如何用卷曲测试我的表单?除了cookie值和http标头之外,我还没有考虑哪些因素?
这是一个教育项目,不适用于生产.我不打算将用户登录作为其中的一部分.
我可以使用CSRF令牌对Django进行POST调用而无需用户登录吗?我可以不使用jQuery吗?我在这里超出了我的深度,肯定会混淆一些概念.
对于JavaScript方面,我发现了这个redux-csrf包.我不确定如何将它与我POST使用Axios的动作结合起来:
export const addJob = (title, hourly, tax) => {
console.log("Trying to addJob: ", title, hourly, tax)
return (dispatch) => {
dispatch(requestData("addJob"));
return axios({
method: 'post',
url: "/api/jobs",
data: {
"title": title,
"hourly_rate": hourly,
"tax_rate": tax
},
responseType: 'json'
})
.then((response) => {
dispatch(receiveData(response.data, "addJob"));
})
.catch((response) => {
dispatch(receiveError(response.data, "addJob"));
})
}
};
Run Code Online (Sandbox Code Playgroud)
在Django方面,我已经阅读了关于CSRF的这个文档,这通常与基于类的视图一起使用.
这是我到目前为止的观点:
class JobsHandler(View):
def get(self, request):
with open('./data/jobs.json', 'r') as f:
jobs = json.loads(f.read())
return …Run Code Online (Sandbox Code Playgroud) 在我的django应用程序中,我在数据库中存储html字符串,然后将在用户的主页上显示为"消息".其中一些消息包含表单,但没有用模板语言编写,我无法插入csrf令牌(因此破坏了应用程序).
有没有办法直接从我正在编辑的python文件中插入此标记?我正在寻找以下内容:
csrf_token = django.csrf.generate()
message = "press the button please: <form><input type='hidden' name='csrf_token' value='%s'><input type='submit' value='press here'></form>" % (csrf_token)
Run Code Online (Sandbox Code Playgroud)
任何其他可以在类似情况下工作的解决方案都会很棒.谢谢
编辑: 实际上这不会起作用,因为每个会话的令牌都不同,因此将其存储在数据库中并不是很有用.有没有办法在视图中动态加载令牌?
在Angular1中,可以通过配置$ http-provider来解决问题.喜欢:
app.config(function($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
});
Run Code Online (Sandbox Code Playgroud)
在Angular2中做同样的事情有什么好处?
在Angular2中使用http请求我们需要使用类Http.当然,在每个后期函数调用中添加CSRF-line并不是一个好习惯.
我想在Angular2中我应该创建自己的类来继承Angular2的Http类并重新定义后期函数.这是正确的方法还是有更优雅的方法?
我有以下代码,在Django 1.2.5中工作正常:
from django.views.decorators.csrf import csrf_exempt
class ApiView(object):
def __call__(self, request, *args, **kwargs):
method = request.method.upper()
return getattr(self, method)(request, *args, **kwargs)
@csrf_exempt
class MyView(ApiView):
def POST(self):
# (...)
return HttpResponse(json.dumps(True), mimetype="text/javascript")
Run Code Online (Sandbox Code Playgroud)
但是当我升级到Django 1.4时,我开始禁止403,"CSRF验证失败"消息.
为什么@csrf_exempt装饰工作不起作用?
网址定义是:
from django.conf.urls.defaults import *
from django.views.decorators.csrf import csrf_exempt
import views
urlpatterns = patterns('',
url(r'^myview/(?P<parameter_name>[A-Za-z0-9-_]+)/$',
views.MyView(),
name="myproject-myapp-myview",
),
)
Run Code Online (Sandbox Code Playgroud) 当我使用时,为什么不显示隐藏输入字段的标记{{ csrf_token }}?
这是我模板中的一个片段:
<form action="." method="post">
{{ csrf_token }}
Run Code Online (Sandbox Code Playgroud)
我期待生成这样的东西:
<form action="." method="post">
<input type="hidden" name="csrfmiddlewaretoken" value="0c90dab91e22382cbaa5ef375f709167">
Run Code Online (Sandbox Code Playgroud)
但相反,这是生成的HTML:
<form action="." method="post">
0c90dab91e22382cbaa5ef375f709167
Run Code Online (Sandbox Code Playgroud)
我已经做了很多次,并且在我的其他项目中工作正常,但我不知道这次我错过了什么.
我的views.py文件如下所示:
from django.shortcuts import render_to_response
from django.template import RequestContext
def home(request):
return render_to_response('home.html',
context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在使用RequestContext.我的中间件类在settings.py文件中定义如下:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
Run Code Online (Sandbox Code Playgroud)
所以我使用的是django.middleware.csrf.CsrfViewMiddleware.另外,我在Django 1.3.0上.有什么想法吗?
我是Django的新手,我仍然试图掌握它的功能.我用Django 1.4.2创建了一个非常简单的项目,它有一个简单形式的索引页面,你输入的东西和结果页面,你的输入在提交后显示(代码如下).
提交后,我收到错误403和以下消息:
模板中使用了{%csrf_token%},但上下文未提供值.这通常是由于不使用RequestContext引起的.warnings.warn(模板中使用了"A {%csrf_token%}",但上下文没有提供值.这通常是由于不使用RequestContext引起的.")
的index.html
<!DOCTYPE html>
<head>
<title>Index page</title>
</head>
<body>
<div id="header">Welcome to index page</div>
<div id="content">
<p>Enter your name</p>
<form action="/result/" method="post" accept-charset="utf-8">{% csrf_token %}
<input type="text" name="answer">
<input type="submit" value="Send!">
</form>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
result.html
<!DOCTYPE html>
<head>
<title>Result page</title>
</head>
<body>
<div id="header">Here is the result</div>
<div id="content">
<p>Your name is: {{ answer }}</p>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
views.py
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
def index(request):
return render_to_response('index.html') …Run Code Online (Sandbox Code Playgroud) django ×10
django-csrf ×10
csrf ×7
python ×2
angular ×1
axios ×1
curl ×1
django-forms ×1
jquery ×1
python-3.x ×1
reactjs ×1
redux ×1