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 验证一起使用,则不必担心!Aaaand 你很高兴去。

于 2011-06-01T00:38:42.160 回答