我想知道在什么情况下使用@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来增加网站的可扩展性?
答案 0 :(得分:1)
如果您禁用csrf,那么任何网站都可以增加您的计数器。由于您的观点没有做任何特殊的事情,我认为它不具有特别的安全重要性(但您不知道何时涉及安全性)。如果您禁用csrf的唯一原因是为了避免csrf错误,那么实际上有一个非常简单的修复。只需包含要点中的代码,它就像魔法一样......
https://gist.github.com/miki725/3892061
顺便说一下,我编写了官方django docs的代码。
修改强>
此修复仅适用于jquery,但在其他js框架中有类似的修复,如angular等等