【问题标题】:django csrf in ajax not workajax中的django csrf不起作用
【发布时间】:2012-11-03 17:22:43
【问题描述】:

我有一个表单并使用 json 数据将其发布到服务器,服务器将其保存在数据库中。这是我的代码

function saveChanges() {
    var items = [];
    $('ol.item_list > li.item').each(function(){
        items.push(getItemData($(this)));
    });

    var csrftoken = $.cookie('csrftoken');
    $.ajax({
        url : '',
        type: 'POST',
        headers : {"X-CSRFToken": csrftoken},
        data : $.toJSON(items),
        success: function(data, textStatus, jqXHR){
            console.log(data);
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert(textStatus);
        },
    });

}

问题是,我调用 saveChanges(通过一个按钮)两次,都返回 200 http ok。所以我在数据库中得到了重复的数据。 csrf 令牌是否应该防止重复 sumbit?我该如何解决?

【问题讨论】:

    标签: ajax django csrf


    【解决方案1】:

    不,CSRF 令牌不会阻止任何形式的重复提交。它的目的是防止Cross Site Request Forgery,仅此而已。它会创建一个令牌,因此没有人可以欺骗您提交您不打算做的请求。

    如果您想防止重复提交,一种方法是在单击一次后禁用提交按钮。然而,这绝不是一个好的解决方案,因为 JavaScript 在客户端运行并且很容易被操纵(例如通过 Firebug)。所以重复提交仍然是可能的,只是不那么明显。

    更好的方法是在服务器端 Python 代码中进行验证。您可以检查提交的数据是否已经在数据库中,如果是,则忽略请求或可选地返回错误消息。这确保了即使通过摆弄 JavaScript,恶意用户也无法保存两次数据。

    我会同时使用这两种方式,第一种方式只是告诉用户他不应该尝试两次提交相同的数据 - 这只是一个界面特权。

    【讨论】:

      【解决方案2】:

      您应该注意正确地防止重复提交 布置你的脚本执行流程和脚本结构,以便防止这种情况发生。

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 2016-06-25
        • 1970-01-01
        • 2013-03-13
        • 2016-02-05
        • 1970-01-01
        • 2012-08-02
        • 2012-01-04
        相关资源
        最近更新 更多