csrf_exempt装饰者不予豁免

时间:2017-02-04 01:13:54

标签: php django wordpress curl csrf-protection

我有一个用于将数据发布到django视图的wordpress网站(用PHP编码)。我发布了这段代码

$ch = curl_init( $url );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, 'https://mydjangosite.com/blah/blah2/');

上面的url所使用的函数是使用@csrf_exempt装饰器,因为我想在此实例中允许跨站点帖子

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
@api_wrapper
def add_referral_api(request, status_slug):

但是,我仍然在日志中收到此错误

[03/Feb/2017 18:17:48] WARNING [django.request:177] Forbidden (CSRF cookie not set.): 

如何在受信任的网站之间允许此类跨网站发布?

修改的 我的中间件类就是这样的。请注意,此站点使用ssl证书,因为它的价值,我怀疑额外的安全性导致csrf_exemption装饰器不能正常工作。即便如此,我还是想以某种方式说这个网站(我的WP网站)可以接收来自的帖子数据。

MIDDLEWARE_CLASSES = (
    # This middleware is for ensuring that all pages use https
    #'djangosecure.middleware.SecurityMiddleware',
    'django.middleware.gzip.GZipMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'common.middleware.XsSharing',
    'impersonate.middleware.ImpersonateMiddleware',
    'referrals.middleware.ReferralMiddleware',
)

1 个答案:

答案 0 :(得分:0)

在与Matt聊天之后,我们发现罪魁祸首是@api_wrapper装饰者(因此,我最初的直觉是正确的),因为它正在调用@ensure_csrf_token装饰器,呈现@csrf_exempt无用。 PHP调用给出了Bad Request (400),但这超出了这个问题的范围。