簡體   English   中英

未為某些用戶設置django CSRF令牌cookie

[英]django CSRF token cookie not set for some users

在大多數正常運行的應用程序中,我一直遇到零星的CSRF錯誤。 我應該做的所有事情:我在模板中使用{% csrf_token %}以獲取普通表單,並在我的ajax POST中設置X-CSRFToken標頭:

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
    },
});

我什至通過編寫調用get_token的自定義中間件來強制在所有視圖中設置cookie。

def CSRFForceCookieMiddleware(get_response):
    def middleware(request):
        response = get_response(request)
        get_token(request) # Force to set cookie in all responses
        return response
    return middleware

在我的本地主機和大多數用戶的生產環境中,一切正常。 但是對於某些用戶,我會收到403 CSRF驗證錯誤。

我添加了很多調試信息。 事實證明,即使CsrfViewMiddleware設置了csrftoken也在響應中設置cookie,在實際的瀏覽器中也沒有設置cookie( $.cookie('csrftoken')null )。 因此,在進行ajax調用時,請求中沒有cookie。

因此,我想這幾乎意味着某些用戶的瀏覽器正在阻止此Cookie? 其他人有這種經歷嗎?

大多數瀏覽器都有“阻止所有cookie”選項。 您可能想在javascript中檢測到該錯誤,並向您的用戶發出警告,要求某些功能性cookie才能使網站正常工作。 還有另一個SO問題顯示了如何執行此操作。

或者,從隱藏的輸入字段中獲取令牌( {% csrf_token %}將在您的模板中添加該字段)。 那應該一直有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM