入力ボタン 非常に深刻な問題です
返金ページにボタンがあります
このボタンを押すと、 SQL を実行します。これは、他の人が支払った合計金額を Web サイトのアカウントに返します。
問題は、この注文のキャンセルをクリックすると、ブラウザが応答するまでに 1 ~ 2 秒かかることです。しかし、押し続けると、返金されたお金が重ねて表示されることがわかりました!
たとえば、ユーザーが注文のキャンセルを 10 回連続してクリックすると、何回クリックしても 100 元が返金されます。返金は10元になります。
これを解決するにはどうすればよいですか?
-----解決策--------------------------------
送信後、そのボタンはハッキングされます。さらに、セッション変数を使用して制御します。提出する際はチェックを入れて再提出するかどうかを判断してください。
------解決策----------------------
一般的に現金を伴う支払いページの場合、フォームには注文 ID が隠されている必要があります。データベースがトランザクションを実行しているため、繰り返し送信される問題は発生しません。
ここでのアプリケーションがメッセージの繰り返しを防ぐためだけに非常に一般的である場合、それを実現する方法はまだいくつかあります。 PHP 自体はこのトランザクションを実行できません。つまり、ID が支払われたかどうかを確認し、支払済みとしてマークするという 2 つの操作は、データベースのみがトランザクションのアトミック性を保証できるためです。もう 1 つの方法は、memcache のアトミックな追加です。これは賢明です。技術。
ここでは、ID は session_start の後にローカライズされ、PHP プロセス間で共有できないため、セッションの助けを借りて保存されません。そのため、フォームの非表示 ID は session_id の助けを借りてのみ memcache に保存されます。
フォームを更新すると、memcache の ID が非表示フィールドに配置され、アトミックな追加の戻り値がフォーム ID であるかどうかが決定されます。 +1。そうであれば送信は成功し、そうでなければ送信は失敗します。これは、トランザクションを実装するために memcache のアトミックな加算を偽装したものです。アトミックな加算では、最初に取得してから加算することを回避しますが、-1 が id と等しいかどうかを判断する限り、アトミックに 1 を加算して結果を返します。これは冪等性と非常によく似た巧妙なトリックであり、一部の分散ロックフリー操作でこれが行われます。
------解決策---------
ブラウザで無効にすることで無効にすることができます
サーバーが判断を追加することをお勧めします。そうしないと、他の人が繰り返し送信をシミュレートすると終了します