2

私はここの多くの部分(Django / Ajaxなど)に慣れていないので、高レベルのCSFRの図は理解していますが、詳細を完全に把握しているわけではありません。

渡されるデータ量が多いため、リクエストをGETからPUTに変換する必要がありました。高レベルでは、HTTPSを介してdjangoアプリに対してAJAXPOSTAPI呼び出しを行っています。ページが提供されているのと同じドメインに対して呼び出しが行われます。

ただし、「CSRFcookieが設定されていません」というエラーが発生し続けます。

Django1.4を使用しています

CSRF保護を乗り越えるために、他の投稿で言及されているX-CSFRTokenをヘッダーに含め、投稿されたデータに{{csrf_token}}タグを含めました。ただし、そのタグがトークンに置き換えられているようには見えません。X-CSFRToken値は、要求時にNULLとして送信されます。なぜ設定されないのかわからない。

ajaxSetupでPOSTの前にCookieを取得するため、ページビューでensure_csrf_cookie()を使用する必要がないという印象を受けていますが、それも試しました。

私が間違っていることを考えますか?

関連コード:

siteUrl = "https://localhost:8443/"

$.ajaxSetup({ 
     beforeSend: function(xhr, settings) {
         function getCookie(name) {
             var cookieValue = null;
             if (document.cookie && document.cookie != '') {
                 var cookies = document.cookie.split(';');
                 for (var i = 0; i < cookies.length; i++) {
                     var cookie = jQuery.trim(cookies[i]);
                 if (cookie.substring(0, name.length + 1) == (name + '=')) {
                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                     break;
                 }
             }
         }
         return cookieValue;
         }
         if (new RegExp("^"+siteUrl.replace("\\","\\\\")+".*").test(settings.url)) {
             // Only send the token to URLs from our site.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});


$.ajax({
    url: submitUrl,
    data: {'network_ids': JSON.stringify(network_ids),
            'csrfmiddlewaretoken': '{{ csrf_token }}'},
    type: 'POST',
    crossDomain: true,
    dataType: 'json',
    cotentType: 'application/json',
    success: function(mydata) {
        console.log(mydata);
    },
    error: function(jqXHR, textStatus, errorThrown) {alert(textStatus); alert(errorThrown)}
})
4

2 に答える 2

1

いくつかの選択肢があります。このコードリストは、CookieからCSRFトークンを取得することを示しています:https ://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
getCookie('csrftoken');

また、javascript関数がdjangoビューに送信していると仮定すると、そのビューにcsrf保護を無視するように指示できます。https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')
于 2012-08-14T19:40:01.470 に答える
0

あなたのjsはDjangoのテンプレートエンジンを介して提供されていますか?それ以外の場合{{ csrf_token }}は評価されません。実際にサーバーにPOSTされていることを確認しましたか?

また、ドキュメントajaxSendによると、イベントの背後にある考え方は、明示的に渡す必要がないということです。csrf_token

ajaxSetupドキュメントのものとは少し異なることに気づきました。それは正しいかもしれませんが、私はドキュメントからオリジナルをコピーします。

于 2012-08-14T19:32:32.567 に答える