Django Rest Framework忽略带有httpie的缺少的CSRF令牌

维斯安·斯凯鲁鲁(Visgean Skeloru)

我正在使用httpie玩以django 1.7和django rest框架2.4编写的api。今天,我试图删除一个对象:

$ http DELETE :8000/api/items/8/ --verbose
DELETE /api/items/8/ HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, compress
Content-Length: 0
Host: 127.0.0.1:8000
User-Agent: HTTPie/0.8.0


HTTP/1.0 204 NO CONTENT
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Content-Language: cs
Content-Length: 0
Date: Wed, 07 Jan 2015 21:47:06 GMT
Server: WSGIServer/0.1 Python/2.7.6
Vary: Accept, Accept-Language, Cookie

即使它需要CSRF令牌,也成功了。当我尝试使用以下代码从Chrome删除对象时:

$.ajax({
    type: "DELETE",
    url: "http://127.0.0.1:8000/api/items/6/"
});

我收到以下请求:

DELETE /api/items/6/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
Origin: http://127.0.0.1:8000
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
DNT: 1
Referer: http://127.0.0.1:8000/inventory
Accept-Encoding: gzip, deflate, sdch
Accept-Language: cs,en-US;q=0.8,en;q=0.6,es;q=0.4,pt;q=0.2,sk;q=0.2
Cookie: cc_csrf=bd9fbbc8f75cffa2e1e3d2c95c2185c5; _ga=GA1.1.2038400685.1386436341; __utma=96992031.2038400685.1386436341.1417173095.1417428975.79; __utmz=96992031.1409752584.3.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __zlcmid=MpdRtV3vZuf3D9; djdt=hide; sessionid=kiihjh6m77jm8v9ol7xrryip89sny55i; csrftoken=FtnnEWPLhMh0CAGMRMH77nB0AAno93uW

回复:

HTTP/1.0 403 FORBIDDEN
Date: Wed, 07 Jan 2015 21:57:40 GMT
Server: WSGIServer/0.1 Python/2.7.6
Vary: Accept, Accept-Language, Cookie
Content-Type: application/json
Content-Language: en
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS

{"detail": "CSRF Failed: CSRF token missing or incorrect."}

我的设置:

REST_FRAMEWORK = {
    # Use hyperlinked styles by default.
    # Only used if the `serializer_class` attribute is not set on a view.
    'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.serializers.HyperlinkedModelSerializer',

    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],

    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
    'DATETIME_FORMAT': "%B %d, %Y"
}
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',
    'django.middleware.locale.LocaleMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',
)

所以我的问题是:用JS ajax发送DELETE请求和用http发送请求有什么区别?

雅各布·罗兹托西尔(Jakub Roztocil)

这是因为CSRF检查仅在使用进行身份验证时执行SessionAuthentication(即,使用sessionid设置cookie django.contrib.auth):

如果您使用的SessionAuthentication是任何操作POST都需要包含有效的CSRF令牌来源PUTPATCHDELETE

我假设您对HTTPie发送的请求使用另一种auth方法,因此CSRF检查不会在此处应用。

https://github.com/tomchristie/django-rest-framework/blob/master/tests/test_authentication.py

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django rest框架会忽略带有httpie的缺少的csrf令牌

来自分类Dev

如何忽略发送到Django REST Framework的CSRF令牌?

来自分类Dev

Django Rest Framework CSRF令牌失败

来自分类Dev

使用Django Rest Framework时如何获取初始CSRF令牌

来自分类Dev

带有 gRPC 的 Django REST

来自分类Dev

Django Rest Framework and JSONField

来自分类Dev

Django Rest Framework API

来自分类Dev

Django Rest Framework的ModuleNotFoundError

来自分类Dev

Django Rest Framework会话与令牌认证

来自分类Dev

Django Rest Framework会话与令牌认证

来自分类Dev

Django Rest Framework令牌不会自动生成

来自分类Dev

Django Rest Framework-缺少静态目录

来自分类Dev

Django REST框架令牌注册

来自分类Dev

为什么Django / Django REST Framework即使使用force-CSRF也无法深入验证CSRF令牌?

来自分类Dev

带有额外字段的Django Rest Framework用户注册

来自分类Dev

带有多个查找参数的django-rest-framework HyperlinkedIdentityField

来自分类Dev

Django Rest Framework URL模式

来自分类Dev

Django Rest Framework API权限

来自分类Dev

Django Rest Framework权限冲突

来自分类常见问题

Django Rest Framework部分更新

来自分类Dev

Django Rest Framework:最佳做法?

来自分类Dev

Django Rest Framework APIView参数

来自分类Dev

Django REST Framework文件上传

来自分类Dev

Django Rest Framework版本控制

来自分类Dev

Django Rest Framework:管理关系

来自分类Dev

Django Rest Framework反向URL

来自分类Dev

Django REST framework request data

来自分类Dev

Django REST Framework缓存错误

来自分类Dev

Django Rest Framework ImageField可选