6

django 1.3では、ajaxでもcsrfを使用する必要があります。jqueryを使用していて、csrfトークンを$.postに追加したいと思います。これどうやってするの?私はjqueryにあまり熟練していないので、良い説明があればいいでしょう。

レーティングアプリで、星がクリックされると投稿が送信されます。djangoのドキュメントを見たことがありますが、自分の状況で何をすべきかわかりません。私のコードは以下の通りです:

$(function() {  
            $("#avg").children().not(":input").hide();
            $("#rating-widget").children().not("select").hide();    

            $caption = $("<span/>");

            $("#avg").stars({captionEl: $caption});
            $("#rating-widget").stars({
                inputType: "select",
                cancelShow: false,
                captionEl: $caption,
                callback: function(ui, type, value){
-------------->     $.post($("#rating-widget").attr("action"), {score: value}, function(data){

                    });
                }
            });
               $caption.appendTo("#rating-widget");

});

javascriptはテンプレートではなく、静的ファイルにあると言わなければなりません。テンプレートに入れて使用できるようにするのが最善でしょうか{{ csrf_token }}

前もって感謝します!

4

3 に答える 3

7

このコードを関数の前に配置します。CSRFを処理します。

$('html').ajaxSend(function(event, 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]);
                // 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;
    }
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
        // Only send the token to relative URLs i.e. locally.
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    }
});
于 2011-06-01T10:16:34.890 に答える
3

djangoのドキュメントには、各ajaxリクエストにcsrfトークンを自動的に含める方法に関する簡単な説明があります。

于 2011-05-31T23:16:08.890 に答える
1

フォームを使用する必要はありません!投稿を「スター」する関数にバインドされた新しいURLを作成するだけです。例えば

(r'^myapp/star-post/(?P<post_id>.*)/$','myapp.views.myview')

したがって、そのURLにリクエストを送信すると、データベース内の投稿が検索され、フィールドが「スター付き」に変更され、ajaxに応答が返されます。

次に、成功時にコールバック関数を使用して、それに応じてCSSを変更できます(星を入力するなど)。このように、CSRFについて心配する必要はありません。

しかし、クロスサイトスクリプティング攻撃についてはどうでしょうか。ええと、Cookie検証でユーザー認証を使用している場合は、それについて心配する必要はありません!ああ、あなたは行ってもいいです。

于 2011-06-01T00:38:42.160 に答える