0

我正在尝试对 Django 函数进行 AJAX 调用,但在 iOS 8 中开始出现 CSRF 验证失败错误。它适用于最新的 iOS,并且曾经适用于 iOS 8。

这可能与最近对 TLS 的更新有关。我的主机最近弃用了 TLS 1.0 和 TLS_RSA_WITH_3DES_EDE_CBC_SHA。

我将 CSRF 令牌添加为 post 参数。如果我创建函数(服务器端)@csrf_exempt,那么调用就可以工作,但我显然不想剥夺安全性。

我只在 Safari 中测试过这个。我正在使用 Django 1.5.2。

HTML:

# this creates an input with the CSRF token as its value
<div id = "csrf_token" class = "hidden">{% csrf_token %}</div>

Javascript:

csrfmiddlewaretoken = $('#csrf_token input').val();

$.ajax({
        type: "POST",
        url: "<my_url>", 
        data: {"csrfmiddlewaretoken":csrfmiddlewaretoken},
        success: function(data){
         alert("ok");
        }
        ,error: function(xhr, status, error) {
            alert("error " + xhr.responseText);
        }
   });

是否有任何解决方案或者我必须停止支持 iOS 8?我仍然有一些用户在使用它。

4

1 回答 1

0

问题原来是在 iOS 8 中没有传递referer,导致 CSRF 失败。引荐来源网址未通过,因为该页面正在使用引荐来源网址元标记。

<meta name="referrer" content="always">
<meta name="referrer" content="unsafe-url">

这在 iOS 8 中不起作用。

于 2018-07-16T15:55:26.620 回答