บทความนี้แนะนำวิธีการง่ายๆ ในแอปพลิเคชัน ASP เพื่อป้องกันไม่ให้ผู้ใช้ส่งแบบฟอร์มเดียวกันหลายครั้งในระหว่างเซสชันปัจจุบัน ส่วนใหญ่ประกอบด้วยสี่รูทีนย่อย ในแอปพลิเคชันที่เรียบง่าย คุณเพียงแค่ต้องใส่รหัสเหล่านี้ในไฟล์ที่รวมไว้และอ้างอิงโดยตรง สำหรับสภาพแวดล้อมที่ซับซ้อนมากขึ้น เราจะให้คำแนะนำในการปรับปรุงบางอย่างในตอนท้ายของบทความ
1. ขั้นตอนการทำงานขั้นพื้นฐาน
ด้านล่างเราจะพูดถึงรูทีนย่อยทั้งสี่นี้ตามลำดับ
(1) การเริ่มต้น
ที่นี่เราจำเป็นต้องบันทึกตัวแปรสองตัวในอ็อบเจ็กต์เซสชัน ซึ่งได้แก่:
⑴ แต่ละแบบฟอร์มสอดคล้องกับตัวระบุที่ไม่ซ้ำกันที่เรียกว่า FID และใช้ตัวนับเพื่อทำให้ค่าไม่ซ้ำกัน
⑵ เมื่อใดก็ตามที่ส่งแบบฟอร์มสำเร็จ FID จะต้องถูกจัดเก็บไว้ในออบเจ็กต์พจนานุกรม
เราใช้กระบวนการเฉพาะเพื่อเริ่มต้นข้อมูลข้างต้น แม้ว่าจะถูกเรียกใช้โดยรูทีนย่อยแต่ละอันในอนาคต แต่จริงๆ แล้วจะมีการดำเนินการเพียงครั้งเดียวต่อเซสชันเท่านั้น:
เตรียมใช้งานย่อย FID()
ถ้าไม่ใช่ IsObject (เซสชัน (FIIDList)) จากนั้น
ตั้งค่าเซสชัน (FIDList) = Server.CreateObject (Scripting.Dictionary)
เซสชัน(FID)=0
สิ้นสุดถ้า
จบหมวดย่อย
(2) สร้างตัวระบุที่ไม่ซ้ำสำหรับแบบฟอร์ม
ฟังก์ชัน GenerateFID() ต่อไปนี้ใช้เพื่อสร้างตัวระบุเฉพาะสำหรับแบบฟอร์ม ขั้นแรกฟังก์ชันจะเพิ่มค่า FID ขึ้น 1 แล้วส่งคืน:
ฟังก์ชั่นสร้าง FID()
เตรียมใช้งาน FID
เซสชั่น(FID) = เซสชั่น(FID) + 1
สร้าง FID = เซสชัน (FID)
ฟังก์ชันสิ้นสุด
(3) แบบยื่นจดทะเบียน
เมื่อส่งแบบฟอร์มสำเร็จ ตัวระบุเฉพาะของแบบฟอร์มจะถูกลงทะเบียนในออบเจ็กต์พจนานุกรม:
ลงทะเบียนย่อยFID()
หรี่ strFID
เตรียมใช้งาน FID
strFID = คำขอ (FID)
เซสชัน(FIDlist).เพิ่ม strFID ตอนนี้()
จบหมวดย่อย
(4) ตรวจสอบว่ามีการส่งแบบฟอร์มซ้ำหรือไม่
ก่อนที่จะประมวลผลแบบฟอร์มที่ผู้ใช้ส่งมาอย่างเป็นทางการ คุณควรตรวจสอบว่า FID ของมันได้รับการลงทะเบียนในออบเจ็กต์พจนานุกรมหรือไม่ ฟังก์ชัน CheckFID() ต่อไปนี้ใช้เพื่อดำเนินงานนี้ให้เสร็จสมบูรณ์ หากได้รับการลงทะเบียนแล้ว จะส่งกลับ FALSE มิฉะนั้นจะส่งกลับ TRUE:
ฟังก์ชั่น CheckFID()
หรี่ strFID
เตรียมใช้งาน FID
strFID = คำขอ (FID)
CheckFID = ไม่ใช่เซสชัน (FIDlist) มีอยู่ (strFID)
ฟังก์ชันสิ้นสุด
2. วิธีการใช้งาน
มีสองที่ที่ใช้ฟังก์ชันข้างต้น คือ เมื่อสร้างแบบฟอร์มและเมื่อประมวลผลผลลัพธ์ สมมติว่ารูทีนย่อยสี่รายการข้างต้นถูกวางไว้ในไฟล์ Forms.inc โค้ดต่อไปนี้จะกำหนดว่าจะสร้างฟอร์มหรือประมวลผลผลลัพธ์ของฟอร์มตามค่า FID ที่อธิบายนั้นเหมาะสำหรับแอปพลิเคชัน ASP ส่วนใหญ่:
<%ตัวเลือกที่ชัดเจน%">
< !--#include file=forms.inc-->
<HTML>
<หัว><
<TITLE>การทดสอบการส่งแบบฟอร์ม</TITLE>
</HEAD
<ร่างกาย>
-
ถ้า Request(FID) = จากนั้น
สร้างแบบฟอร์ม
อื่น
กระบวนการแบบฟอร์ม
สิ้นสุดถ้า
-
</ร่างกาย><
</HTML><
GenerateForm มีหน้าที่สร้างแบบฟอร์ม ซึ่งควรมี FID ที่ซ่อนอยู่ เช่น:
-
สร้างแบบฟอร์มย่อย()
-
< การกระทำของแบบฟอร์ม=< %=Request.ServerVariables(PATH_INFO)%>< วิธีการ=GET>
< ประเภทอินพุต=ชื่อที่ซ่อนอยู่=ค่า FID=< %=สร้างFID()%>>
<ประเภทอินพุต=ชื่อข้อความ=ค่า param1=>
<ประเภทอินพุต=ค่าส่ง=ตกลง><
</แบบฟอร์ม>
-
จบหมวดย่อย
-
ProcessForm มีหน้าที่รับผิดชอบในการประมวลผลเนื้อหาที่ส่งผ่านแบบฟอร์ม แต่ก่อนที่จะประมวลผล คุณควรเรียก CheckFID() เพื่อตรวจสอบว่าได้ส่งแบบฟอร์มปัจจุบันแล้วหรือไม่ โดยมีโค้ดดังนี้:
-
แบบฟอร์มกระบวนการย่อย()
ถ้า CheckFID() แล้ว
Response.Write สิ่งที่คุณป้อนคือ & Request.QueryString (param1)
ลงทะเบียนFID
อื่น
Response.Write แบบฟอร์มนี้สามารถส่งได้เพียงครั้งเดียว!
สิ้นสุดถ้า
จบหมวดย่อย
-
3. ข้อจำกัดและมาตรการปรับปรุง
ข้างต้น เราได้แนะนำวิธีจำกัดไม่ให้ส่งแบบฟอร์มเดียวกันหลายครั้งในระหว่างเซสชันปัจจุบัน ในการใช้งานจริง อาจต้องมีการปรับปรุงในหลายด้าน เช่น:
⑴ ตรวจสอบความถูกต้องตามกฎหมายของข้อมูลที่ผู้ใช้ป้อนก่อนลงทะเบียน ID แบบฟอร์ม เพื่อว่าเมื่อข้อมูลผิดกฎหมาย ผู้ใช้สามารถกดปุ่มย้อนกลับเพื่อส่งคืนและส่งแบบฟอร์มเดิมอีกครั้งหลังจากแก้ไข
⑵ ข้อจำกัดในการส่งแบบฟอร์มนี้ใช้ได้เฉพาะในช่วงระยะเวลาของเซสชันปัจจุบันเท่านั้น หากจำเป็นต้องมีข้อจำกัดนี้เพื่อขยายหลายเซสชัน Cookeis หรือฐานข้อมูลจะถูกนำมาใช้เพื่อบันทึกข้อมูลที่เกี่ยวข้อง
⑶ วิธีนี้ไม่ปลอดภัย ใช้เพื่อป้องกันการใช้งานในทางที่ผิดเท่านั้น และไม่ได้ป้องกันผู้ใช้ที่มีทักษะจากเจตนาส่งแบบฟอร์มเดียวกันหลายครั้ง