2

私は明らかにどこかで何かを逃しました。

何らかの方法で、顧客は11秒の遅延(チェック時間)内に2回予約を行うことができました。私の最初のことは、ユーザーが予約を行った可能性があり、次にブラウザに戻って予約を再度行った可能性があるということでした。ただし、この動作を防ぐことがわかっている検証が少なくとも2つあるため、これは不可能です。

私に残された唯一の結論は、顧客が予約を送信しようとした場合、Webサービスが11秒以内にフリーズし、顧客がリクエストを中止して再度送信したため、これら2つの予約が同時に発生することを許可したということです。

それを除けば、何が原因なのかわかりませんでした。MySQL挿入の遅延はおそらく?

だから基本的に私が主に疑問に思うのは;
フォームが2回送信されて実行され、2番目のフォームが必要なすべての検証をバイパスする原因は何ですか?

私のフォームの現在のワークフロー

ユーザーは入力フィールドにデータを送信してから送信します。私のシステムは、これらすべての入力を検証し、両方の一意のコードをチェックして、MySQL呼び出しで2回使用されていないことを確認します。また、利用可能な座席数が、予約された座席数と同じかそれ以上であることを確認します。

この場合、同じコードが使用され、座席数が上限を超えています。

基本的に、POSTが検証されない限り、予約はMySQLに挿入されません。

4

2 に答える 2

0

ユーザーは、フォームが処理されるページを更新して、POST情報を2回送信することができますか?検証はどこにありますか。フォームが処理されるのではなく、フォームの表示を停止するだけの場合、これは可能性がありますか?

于 2012-07-11T11:23:45.477 に答える
0

私のシステムは、これらすべての入力を検証し、両方の一意のコードをチェックして、MySQL呼び出しで2回使用されていないことを確認します。

同時実行性の問題があるようです。チェック/挿入中にテーブルをロックしますか?

理論的には、2つの実行が同時に発生した場合、両方とも一意のIDを持ち、シート制限内にあるため、両方の挿入を続行できます(したがって成功します)。

これが私が考えていることの図式的な方法です:

POST 1                  POST 2
Unique ID: 1234         Unique ID: 1234
Check if ID is present  Check if ID is present
ID is not present       ID is not present
Check if seats left     Check if seats left
Make insert             Make insert

2番目のmakePOST 2は、テーブルのロックが解除されるまで、つまりPOST 1挿入が完了するまで、一意のIDチェックを開始できないようにする必要があります。

于 2012-07-11T11:28:38.977 に答える