Django jQuery ajax发布到https失败

时间:2013-08-13 00:37:23

标签: django jquery google-chrome-extension tastypie

我正在编写一个chrome扩展,使用GET和POST ajax调用使用Django和Tastypie制作的api。

GET ajax调用成功,我可以访问数据。但是,POST调用仅在生产中失败,因为api由https://托管,在本地环境中可以运行(htt:// localhost:8000)。

我在标头中提供了正确的 CSRF令牌。 似乎错误发生在这里:https://github.com/toastdriven/django-tastypie/blob/master/tastypie/authentication.py#L259其中api需要 Referer 标头来检查呼叫是否安全。

似乎无法直接在我的ajax标头中设置 Referer 值,只有当标题的名称以X-开头时才会显示。

提前感谢任何解决此问题的解决方案或提示。

马克西姆。

3 个答案:

答案 0 :(得分:1)

检查的原因在original source of that method

中说明
# Suppose user visits http://example.com/
# An active network attacker (man-in-the-middle, MITM) sends a
# POST form that targets https://example.com/detonate-bomb/ and
# submits it via JavaScript.
#
# The attacker will need to provide a CSRF cookie and token, but
# that's no problem for a MITM and the session-independent
# nonce we're using. So the MITM can circumvent the CSRF
# protection. This is true for any HTTP connection, but anyone
# using HTTPS expects better! For this reason, for
# https://example.com/ we need additional protection that treats
# http://example.com/ as completely untrusted. Under HTTPS,
# Barth et al. found that the Referer header is missing for
# same-domain requests in only about 0.2% of cases or less, so
# we can use strict Referer checking.

因此,您可能会或可能不会从推荐人检查中受益 - 由您决定。

如果您希望覆盖它,只需将模型设置为使用SessionAuthentication的子类进行身份验证,并根据需要覆盖is_authenticated(self, request, **kwargs)函数。原始方法非常简洁,所以老实说,我只是复制粘贴它并删除有问题的if request.is_secure():块,而不是欺骗超类认为请求有引用者。

答案 1 :(得分:0)

您还可以通过让请求对象认为它不是通过安全调用来检查AJAX调用中的referer。这样,您可以保留CSRF检查和其他所有内容,只需跳过引用者即可。这是一个示例中间件:

class UnsecureAJAX(object):
    def process_request(self, request):
        setattr(request, '_is_secure_default', request._is_secure)
        def _is_secure():
            if request.is_ajax():
                return False
            else:
                return request._is_secure_default()
        setattr(request, '_is_secure', _is_secure)

答案 2 :(得分:0)

现在,技术上也可以使用Referer API更改请求的webRequest部分。

您需要具有onBeforeSendHeaders选项的["blocking", "requestHeaders"]侦听器以及相应的权限。然后,您可以拦截自己的请求并修改标题。