@csrf_exempt装饰器让django视图不安全吗?

时间:2014-02-12 23:12:20

标签: django security

我想知道在什么情况下使用@csrf_exempt装饰器无法打开可能的XSS漏洞?

举一个具体的例子,这里是我写的视图,它为博客文章添加了一个简单的ajax Like count:

@csrf_exempt
def like(request):
    args = {}
    if request.method == 'POST':
        user = request.POST.get('user')
        lu= request.user 
        post_id = int(request.POST.get('post_id'))
        try:
            liked_blog = Blog.objects.get(id = post_id)
        except:
            liked_blog = None  

        if BlogLike.objects.filter(liker=request.user.id, blog=post_id):

            liked_blog.likes -=1
            liked_blog.save()
            BlogLike.objects.filter(blog=post_id, liker=request.user.id).delete()


        else:            
            liked_blog.likes +=1
            liked_blog.save()
            newliker = BlogLike(blog=post_id, liker=request.user.id)
            newliker.save()          



    args['likes'] = str(liked_blog.likes)
    return render(request, 'ajax_like.html', args)

ajax部分:

$(function(){
$('#like').click(function(){
      $.ajax({
               type: "POST",
               url: "/blog/like/",
               data: {
               'post_id': $(this).attr('name'), 
               'csrfmiddlewaretoken': '{{csrf_token}}'
               },
               success: likeSuccess,
               dataType: 'html'
                }); 
    });

});
function likeSuccess(data, textStatus, jqXHR)
{
    $('#like_count').html(data);
}

我添加了@csrf_exempt来摆脱有关CSRF的恼人错误。 所以我想知道在这种情况下,如何通过添加@csrf_exempt来增加网站的可扩展性?

1 个答案:

答案 0 :(得分:1)

如果您禁用csrf,那么任何网站都可以增加您的计数器。由于您的观点没有做任何特殊的事情,我认为它不具有特别的安全重要性(但您不知道何时涉及安全性)。如果您禁用csrf的唯一原因是为了避免csrf错误,那么实际上有一个非常简单的修复。只需包含要点中的代码,它就像魔法一样......

https://gist.github.com/miki725/3892061

顺便说一下,我编写了官方django docs的代码。

修改

此修复仅适用于jquery,但在其他js框架中有类似的修复,如angular等等