安全地发布到Django,不使用表单,但避免CSRF错误

2024-10-02 20:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把我的iOS应用程序中的数据发布到我的Django服务器上-在URL中编码是不切实际的。我想在不使用表单的情况下完成此操作,只需发送JSON数据并将JSON数据输出。当我尝试时,我遇到了这个错误:

Forbidden (CSRF token missing or incorrect.)

对于开发,我目前正在通过声明我的视图方法为@csrf_exempt来解决这个问题,但我担心这对生产不安全。如果我同时声明方法@login_required,是吗?

假设它是不安全的,我怎么解决这个问题?我理解在HTML模板中使用{% csrf_token %}的方法——我在其他Django应用中也使用过这种方法——但我实际上并没有使用表单,也不希望使用表单。我只是在JSON字典中编码我的请求数据,然后得到一个JSON字典。以下是客户端的相关部分:

^{pr2}$

下面是相关的服务器部分:

@login_required
def my_server_method(request):
    data = simplejson.loads(request.body)
    R = {}
    # Do stuff with the data here and generate a response with JSON data in R
    ....
    return HttpResponse(json.dumps(R), content_type="application/json")

根据我对CSRF机制的了解,CSRF令牌在整个会话中都是有效的。所以我想我可以通过以下方式实现这一点:a)在进行身份验证时,将CSRF令牌传递给iOS客户端,然后b)在我发布数据时包含该令牌。下面是我如何尝试的。在

在服务器上进行身份验证后,我找到带有此标记的CSRF令牌并将其发送到客户端:

session_csrf_token = django.middleware.csrf.get_token(request)

我试着通过修改上面的客户机代码来传递它。首先,我用我的session_csrf_token(登录时在客户机上存储为_csrfToken)来扩充发送的数据:

NSMutableDictionary *dictCSRF = [NSMutableDictionary dictionaryWithDictionary:dictWithMyData];
[dictCSRF setObject:_csrfToken forKey:@"csrfmiddlewaretoken"];
NSData *data = [NSJSONSerialization dataWithJSONObject:dictCSRF options:NSJSONWritingPrettyPrinted error:error];

然后我增加请求头,如下所示:

[request setValue:_csrfToken forHTTPHeaderField:@"X-CSRF-Token"];

但它不起作用。我得到同样的“CSRF令牌丢失或不正确”错误。在

有什么办法让它发挥作用吗?


Tags: 数据django方法服务器tokenjson客户端表单