CSRF令牌未得到验证

时间:2018-10-17 14:42:23

标签: python django csrf django-1.8

我有一个表格:

<form action="{% url "some_url" %}" method="post">
    {% csrf_token %}
    <input type="text">Text Input
    <button type="submit">Submit</button>
</form>

正在通过AJAX提交

$(function () {
    $('form').submit(function (e) {
        e.preventDefault();
        $.post($(this).attr('action'), $(this).serialize(), function (response) {
            console.log(response);
        });
    });
});

URL路由到该视图:

class SomeView(View):
    def post(self, request, *args, **kwargs):
        context = dict(**some_data)
        rendered_html = render_to_string('some_template.html', context, RequestContext(self.request))
        return JsonResponse(dict(html=rendered_html))

所有这些有效。问题是,当未发送CSRF令牌时,它也可以工作,我得到的是完全相同的成功响应:

$.post($(this).attr('action'), function (response) {
    console.log(response);
});

我希望会因为CSRF令牌丢失而引发某种错误。

要声明显而易见的内容:CsrfViewMiddlewareMIDDLEWARE_CLASSES之内。

未发送令牌时,显式使用csrf_token的结果相同:

method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
    return super(SomeView, self).dispatch(request, *args, **kwargs)

我该怎么做以加强其验证?

1 个答案:

答案 0 :(得分:0)

@dabadaba也许CSRF令牌是通过cookie发送的。因此,无论您张贴什么cookie,都会将其发送到服务器。在此处阅读更多详细信息:https://docs.djangoproject.com/en/2.1/ref/csrf/