この記事では、ASP アプリケーションでユーザーが現在のセッション中に同じフォームを複数回送信できないようにする簡単な方法を紹介します。これは主に 4 つのサブルーチンで構成されており、より複雑な環境では、これらのコードをインクルードされたファイルに入れて直接参照するだけで済みます。記事の最後にいくつかの改善案を示します。
1. 基本的な作業手順
以下では、これら 4 つのサブルーチンについて順番に説明します。
(1) 初期化
ここでは、Session オブジェクトに次の 2 つの変数を保存する必要があります。
⑴ 各フォームは FID と呼ばれる一意の識別子に対応しており、その値を一意にするためにカウンタが使用されます。
⑵ フォームが正常に送信されるたびに、その FID を Dictionary オブジェクトに保存する必要があります。
上記のデータは専用のプロセスを使用して初期化されます。将来的には各サブルーチンによって呼び出されますが、実際にはセッションごとに 1 回だけ実行されます。
SubInitializeFID()
IsObject(Session(FIDList)) でない場合
Set Session(FIDList)=Server.CreateObject(Scripting.Dictionary)
セッション(FID)=0
終了の場合
エンドサブ
(2) フォームの一意の識別子を生成する
次の関数 GenerateFID() は、フォームの一意の識別子を生成するために使用されます。この関数は、まず FID 値を 1 ずつ増分してから、それを返します。
FunctionGenerateFID()
FIDの初期化
セッション(FID) = セッション(FID) + 1
GenerateFID = セッション(FID)
終了機能
(3) 登録提出フォーム
フォームが正常に送信されると、その一意の識別子が Dictionary オブジェクトに登録されます。
サブレジスタFID()
ディム strFID
FIDの初期化
strFID = リクエスト(FID)
Session(FIDlist).Add strFID, now()
エンドサブ
(4) フォームが繰り返し送信されていないか確認する
ユーザーが送信したフォームを正式に処理する前に、その FID が Dictionary オブジェクトに登録されているかどうかを確認する必要があります。次の CheckFID() 関数は、この作業を完了するために使用されます。登録されている場合は FALSE を返し、登録されていない場合は TRUE を返します。
関数 CheckFID()
ディム strFID
FIDの初期化
strFID = リクエスト(FID)
CheckFID = セッション(FIDlist).Exists(strFID)ではありません
終了機能
2. 使用方法
上記の関数は 2 つの場所で使用されます。つまり、フォームの生成時と結果の処理時です。上記の 4 つのサブルーチンが、組み込まれたファイル Forms.inc に配置されていると仮定します。次のコードは、FID 値に基づいてフォームを生成するか、フォームの結果を処理するかを決定します。この処理プロセスは、ほとんどの ASP アプリケーションに適しています。
<%オプション明示%>
< !--#include file=forms.inc-->
<HTML>
<頭>
<TITLE>フォーム提出テスト</TITLE>
</頭
<ボディ>
< %
リクエスト(FID) = の場合
フォームの生成
それ以外
プロセスフォーム
終了の場合
%>
</BODY>
</HTML>
GenerateForm はフォームの生成を担当します。フォームには、次のような非表示の FID が含まれている必要があります。
< %
SubGenerateForm()
%>
< フォームアクション=< %=Request.ServerVariables(PATH_INFO)%> メソッド=GET>
< 入力タイプ=隠し名=FID値=< %=GenerateFID()%>>
<入力タイプ=テキスト名=param1値=>
<入力タイプ=送信値=OK>
</フォーム>
< %
エンドサブ
%>
ProcessForm はフォームを通じて送信されたコンテンツを処理しますが、処理の前に CheckFID() を呼び出して、現在のフォームが送信されたかどうかを確認する必要があります。コードは次のとおりです。
< %
サブプロセスフォーム()
CheckFID() の場合
Response.Write 入力した内容は & Request.QueryString(param1)
FID を登録する
それ以外
Response.Write このフォームは 1 回のみ送信できます。
終了の場合
エンドサブ
%>
3. 制限事項と改善策
上記では、現在のセッション中に同じフォームが複数回送信されるのを制限する方法を紹介しました。実際のアプリケーションでは、次のような多くの側面で改善が必要になる場合があります。
⑴ フォームIDを登録する前にユーザーが入力したデータの正当性を確認し、データが不正な場合は戻るボタンを押して戻り、修正後に同じフォームを再度送信することができます。
⑵ フォーム送信に関するこの制限は、最大でも現在のセッション期間中にのみ有効です。複数のセッションにまたがる場合にこの制限が必要な場合は、Cookie またはデータベースを使用して関連データを保存します。
⑶ この方法は安全ではありません。これは悪用を防ぐためにのみ使用され、熟練したユーザーが意図的に同じフォームを複数回送信することを妨げるものではありません。