0

フォームがあり、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 を 2 回呼び出すと、すべて 200 http OK が返されることです。そのため、データベースに重複データがありました。csrf トークンは、sumbit の重複を証明する必要がありますか? どうすれば修正できますか?

4

2 に答える 2

1

スクリプト実行フローとスクリプト構造を適切にレイアウトして二重送信を防止し、二重送信を防止する必要があります。

于 2012-11-15T08:19:11.700 に答える
0

いいえ、CSRF トークンは、いかなる種類の重複送信も防止しません。その目的は、クロス サイト リクエスト フォージェリを防止することだけです。トークンを作成するため、意図しないリクエストを送信して誰もあなたを騙すことはできません。

重複送信を防ぎたい場合は、一度クリックした送信ボタンを無効にする方法があります。ただし、JavaScript はクライアント側で実行され、(Firebug などを介して) 簡単に操作できるため、これは決して良い解決策ではありません。したがって、重複送信は引き続き可能ですが、明らかにそうではありません。

より良い方法は、サーバー側の Python コードで検証を行うことです。送信されたデータが既にデータベースにあるかどうかを確認し、存在する場合は、要求を無視するか、オプションでエラー メッセージを返すことができます。これにより、悪意のあるユーザーが JavaScript をいじっても、データを 2 回保存することはできなくなります。

私はこれらの手段の両方を使用します。最初の手段は、ユーザーに同じデータを 2 回送信してはならないことを伝えるためのものです。

于 2012-11-15T08:10:53.303 に答える