csrf验证失败请求被中断 - django关闭csrf




Django-CSRF验证失败-从静态网站上的表单发送数据到我的Django应用程序 (2)

我的设置:

  • 作为着陆页的静态网站通过aws S3(welcome.mydomain.com)提供。
  • 一个django应用程序(Django的1.8与Python 2.7)可以通过一个子域(app.mydomain.com)访问。

我想添加一个联系表单,这是我的静态网站的一部分,并将联系表单信息发送到我的Django服务器进行处理。 我不想将联系表单作为模板添加到我的django应用程序中,因为我使用不同的样式表和资源,并且不希望在服务器之间混用它们。 处理表单数据的视图只是将这些数据添加到电子邮件中,并将其发送到内部电子邮件地址。

我得到一个403 csrf验证失败的错误,因为表单不包含csrf标记。

我现在可以免除接受csrf验证请求的视图,但我不确定这会带来哪些安全风险。

我不确定我是否不了解CSRF的攻击和危险,或者我是否看错了这个问题。 我所有的搜索和django-csrf相关问题的答案迄今为止还没有帮助我。

这是我的问题:

  • 有没有更好的方法来解决这个问题?
  • 我可以使用csrf_exempt而不会增加任何安全风险(例如,通过额外的验证)?

您可以动态添加CSRF令牌,这是用于Ajax请求的技术。 从https://docs.djangoproject.com/en/1.11/ref/csrf/

/**
 * getCookie gets a cookie called 'name' in the current session
 * @param name name of the cookie to get
 * @returns value of the cookie requested, null if not found
 */
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;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

/**
 * When doing posts, deletes, etc. we need to transmit the CSRF cookie for
 * the request to go through properly, so add the cookie to all ajax calls
 * that need the cookie.
 */
$.ajaxSetup({
    beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

然后,您可以通过ajax调用在表单上发布“提交”表单,然后重定向到下一页。








django-csrf