【问题标题】:csrf_exempt decorator not exemptingcsrf_exempt 装饰器不豁免
【发布时间】:2017-02-04 22:37:13
【问题描述】:

我有一个 wordpress 网站(用 PHP 编码),我用它来将数据发布到 django 视图。我用这段代码发帖

$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',
)

【问题讨论】:

  • “api_wrapper”有什么作用?你确定这个视图是被击中的吗?
  • 是的。它所做的是获取发布的信息并将记录添加到数据库中。
  • 您有没有将CSRF_COOKIE_SECURE 设置设置为True
  • 我也想过,但不是。
  • 你能列出你的中间件吗?

标签: php django wordpress curl csrf-protection


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多