0

この件に関していくつかのトピックが作成されていることがわかりましたが、私のケースに適用できる解決策を実際に見つけることができませんでした.

私の問題は、ユーザーが自分のページでフォームを送信すると、ブラウザーが停止し、要求が処理されている間に一部のユーザーがページを更新しようとし、行がデータベースに 2 回挿入されることです。スクリプトの途中に 2 つの curl 呼び出しがあり、完了するまでに数秒かかることがあります。これが遅延の原因です。ページを更新すると、同じセッションの詳細で新しい接続が開き、再度送信されると思いますが、放棄されたバックエンド スクリプトはまだプロセスで動作しています。そして、最も重要な (そして悪い) ことは、フォームがそれ自体に投稿されることです。

いくつかの対策を適用しようとしました (生成されたセッション変数を追跡する SESSION をワイプするなど...) プロセス スクリプトが偽造されたブラウザーで攻撃される可能性があるため、フォームの非表示フィールドはオプションではないと考えています。

私の提案は、プロセス部分をビューから切り離し、別のスクリプトに移行して、Ajax 経由で呼び出すことです。Ajax が呼び出されている間、送信ボタンを無効にして、処理中にページを更新しないようにユーザーに促します。このようにして、ページを更新しても再度送信されることはなく、その時までに、プロセスは SESSION 変数を設定して再送信を防ぐことができます。

このソリューションについてどう思いますか?

システム全体がプロセスに基づいて構築されているため、プロセスに大きな変更を加えることができないため、これが悪い、またはプロセスに悪い、これまたはそれを変更するなどの投稿はしないでください。

どうもありがとう。

////////////////////////////////////////////// /////////////////////////

拡大:

  • 自己投稿モンスター スクリプトのプロセス部分を Ajax スクリプトに移行しました。
  • ajaxが起動された後、送信ボタンを無効にし、スピナーにテキストを表示してブラウザを更新しないでください
  • Ajax スクリプトで操作が完了したときに、プロセスが完了したことを示すセッション変数を設定します
  • それでもブラウザを更新すると、フォーム データがクリアされ、もう一度入力する時間がなくなるため、フォームを再度送信するまでに、セッション変数はすでに設定されており、送信ボタンを押すと、メッセージが表示され、確認ページにリダイレクトされます。

これまでのところ、数回のテスト実行で問題なく動作しているようです。

皆さんは、このソリューションについてどう思いますか? 抜け穴やセキュリティへの影響はありますか? (Json 経由でスクリプトからエラー メッセージが送信されます)

4

3 に答える 3

1

わかりました、別の行きます:

<?php
   session_start();
   $old_session_exists = false;
   while (isset($_SESSION['processing-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']])) {
      $old_session_exists = true;
      sleep(5);
   }

   if (!$old_session_exists) {
      // process your cURL and save output into another session variable
      $_SESSION['processing-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']] = 1;
      $_SESSION['result-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']] = cURL(...);

      // remove processing session
      unset($_SESSION['processing-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']]);
   }

   // return the result from session
   $ret = $_SESSION['result-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']];
   unset($_SESSION['result-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']]);
   return / echo $ret;
?>
于 2012-08-22T11:41:05.303 に答える
0

非同期 cURLを使用するのはどうですか?

于 2012-08-22T10:08:05.067 に答える
0

ゲルギウス:

ソリューションに関する私の見解は、正確に何を送信しているかによって異なります (たとえば、従来のアプローチを使用すると、JS リクエストを介してファイルを送信できないはずです)。また、Ajax を使用すると、アプリケーションが JS を有効にすることに依存するようになりますが、それは問題でしょうか? 最後に、気をつけていてもリクエストが偽造される可能性があります...

それを考えると、私の見解は「お願いします、しないでください」です。それは問題に不必要な複雑さを加えていると思います。

邪悪で汚いですが、隠しフレームに送信しようとしましたか?. これは、フォームが送信されるとすぐに「お待ちください」というメッセージを表示できる典型的なソリューションです。すべてのものと同様に、それは偽造されたり壊れたりする可能性がありますが、そうでないものは何ですか?.

于 2012-08-22T10:01:54.883 に答える