2

私のウェブサイトでは、投票があります。これは、Cookie ベースの投票です。ユーザーが投票すると、現在の投票で Cookie が作成されるため、新しい投票が作成されるまで投票できません。ユーザーが Cookie を削除して再度投票できることはわかっていますが、それは問題ではありません。

ajax投稿を処理するajax.phpページがあります。コードは次のとおりです。

if(isset($_COOKIE['poll_id']) && $_COOKIE['poll_id'] == $poll_id)
{
// print message that it is already voted, show the results...
}
else
{
// update the database and create a cookie
}

ボタンのクリックで投票が行われる場合、このコードは正常に機能します。しかし、私はこれを行っている Firebug で JavaScript を開始しました:

for(var i=0;i<100;i++) {
    jQuery.post('ajax.php', {
        //post parameters
    });
}

そして私は100票を獲得します。スクリプトを再度実行すると、Cookie が作成されるため失敗しますが、100 の同時要求を行うと、システムが時間内に Cookie を作成する時間がないと推測されるため、チェックが失敗するようです。したがって、すべての更新が行われます。

これを解決する方法について何か提案はありますか?

4

2 に答える 2

2

これがXSRF遊びに来るところです。サイトでは、最初にランダムな (適切にソルトされ、十分に安全な) 文字列を作成し、セッションに保存する必要があります。すべてのページで、このセッション値を取得し、フォーム送信で渡す必要があります。ユーザー入力を調べるときは、ページ要求の一部としてこの値を確認する必要があります。

投票ページでこれを送信し、ajax.php でこれを調べると、その値が見つかり、これが安全な要求であることがわかります。誰かが firebug/jquery などでスマートなことをしようとすると、この値にアクセスしたり送信したりできなくなり、ページはそのようなリクエストを無視できます。

もちろん、私の説明は、理解を深めるために単純化しすぎています。しかし、それについてもっと読んでください。それは、シナリオを解決し、コードをより堅牢にするのに役立ちます。

簡単な疑似コードの例を追加します。

最初に、ランダムな XSRF 文字列がセッションで既に設定されていると仮定します。

jQuery.post('ajax.php', {
     <?php echo $_SESSION['token'];?>,
    //rest of the post parameters
});

誰かがfirebugで試してみると:

for(var i=0;i<100;i++) {
    jQuery.post('ajax.php', {
        //post parameters
        //cannot access $_SESSION['token'] so cannot pass it..
    });
}
于 2012-10-25T22:48:18.717 に答える
0

Set-Cookie ヘッダーがリクエストに含まれるように、Cookie を設定するときにリダイレクトを試みます。

于 2012-10-25T22:42:17.600 に答える