การตรวจสอบแบบฟอร์ม PHP
บทนี้และบทต่อไปจะแสดงวิธีใช้ PHP เพื่อตรวจสอบความถูกต้องของข้อมูลในแบบฟอร์ม
การตรวจสอบแบบฟอร์ม PHP
คิดว่าการรักษาความปลอดภัยเมื่อประมวลผลแบบฟอร์ม PHP!
หน้าเหล่านี้จะแสดงวิธีดำเนินการกับแบบฟอร์ม PHP โดยคำนึงถึงความปลอดภัย การตรวจสอบข้อมูลแบบฟอร์มอย่างเหมาะสมเป็นสิ่งสำคัญในการปกป้องแบบฟอร์มของคุณจากแฮกเกอร์และนักส่งสแปม!
แบบฟอร์ม HTML ที่เราจะใช้งานในบทเหล่านี้ ประกอบด้วยช่องป้อนข้อมูลต่างๆ: ช่องข้อความบังคับและตัวเลือกเสริม ปุ่มตัวเลือก และปุ่มส่ง:
กฎการตรวจสอบสำหรับแบบฟอร์มด้านบนมีดังนี้:
Field | Validation Rules |
---|---|
Name | Required. + Must only contain letters and whitespace |
Required. + Must contain a valid email address (with @ and .) | |
Website | Optional. If present, it must contain a valid URL |
Comment | Optional. Multi-line input field (textarea) |
Gender | Required. Must select one |
ขั้นแรกเราจะดูโค้ด HTML ธรรมดาสำหรับแบบฟอร์ม:
ช่องข้อความ
ฟิลด์ชื่อ อีเมล และเว็บไซต์เป็นองค์ประกอบการป้อนข้อความ และฟิลด์ความคิดเห็นคือพื้นที่ข้อความ โค้ด HTML มีลักษณะดังนี้:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
ปุ่มตัวเลือก
ฟิลด์เพศคือปุ่มตัวเลือกและโค้ด HTML มีลักษณะดังนี้:
Gender:
<input type="radio" name="gender"
value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
องค์ประกอบของแบบฟอร์ม
รหัส HTML ของแบบฟอร์มมีลักษณะดังนี้:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
เมื่อส่งแบบฟอร์มแล้ว ข้อมูลในแบบฟอร์มจะถูกส่งไปยัง method="post"
ตัวแปร $_SERVER["PHP_SELF"] คืออะไร
$_SERVER["PHP_SELF"] เป็นตัวแปร super global ที่ส่งคืนชื่อไฟล์ของสคริปต์ที่รันอยู่ในปัจจุบัน
ดังนั้น $_SERVER["PHP_SELF"] จะส่งข้อมูลแบบฟอร์มที่ส่งไปยังหน้านั้นเอง แทนที่จะข้ามไปยังหน้าอื่น วิธีนี้จะทำให้ผู้ใช้ได้รับข้อความแสดงข้อผิดพลาดในหน้าเดียวกับแบบฟอร์ม
ฟังก์ชัน htmlspecialchars () คืออะไร
ฟังก์ชัน htmlspecialchars() แปลงอักขระพิเศษเป็นเอนทิตี HTML ซึ่งหมายความว่าจะแทนที่อักขระ HTML เช่น < และ > ด้วย < และ >. สิ่งนี้จะป้องกันผู้โจมตีจากการใช้ประโยชน์จากโค้ดโดยการฉีดโค้ด HTML หรือ Javascript (การโจมตีแบบ Cross-site Scripting) ในรูปแบบ
Big Note เกี่ยวกับความปลอดภัยของฟอร์ม PHP
แฮกเกอร์สามารถใช้ตัวแปร $_SERVER["PHP_SELF"] ได้!
หากใช้ PHP_SELF ในหน้าเว็บของคุณ ผู้ใช้สามารถป้อนเครื่องหมายทับ (/) แล้วตามด้วยคำสั่ง Cross Site Scripting (XSS) เพื่อดำเนินการ
Cross-site scripting (XSS) เป็นช่องโหว่ด้านความปลอดภัยคอมพิวเตอร์ประเภทหนึ่งที่มักพบในเว็บแอปพลิเคชัน XSS ช่วยให้ผู้โจมตีสามารถแทรกสคริปต์ฝั่งไคลเอ็นต์ลงในหน้าเว็บที่ผู้ใช้รายอื่นดูได้
สมมติว่าเรามีแบบฟอร์มต่อไปนี้ในหน้าชื่อ "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
ตอนนี้ หากผู้ใช้ป้อน URL ปกติในแถบที่อยู่ เช่น "http://www.example.com/test_form.php" โค้ดด้านบนนี้จะถูกแปลเป็น:
<form method="post" action="test_form.php">
จนถึงตอนนี้ดีมาก
อย่างไรก็ตาม ให้พิจารณาว่าผู้ใช้ป้อน URL ต่อไปนี้ในแถบที่อยู่:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
ในกรณีนี้ โค้ดข้างต้นจะถูกแปลเป็น:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
รหัสนี้เพิ่มแท็กสคริปต์และคำสั่งแจ้งเตือน และเมื่อหน้าโหลด โค้ด JavaScript จะถูกดำเนินการ (ผู้ใช้จะเห็นช่องแจ้งเตือน) นี่เป็นเพียงตัวอย่างที่เรียบง่ายและไม่เป็นอันตรายถึงวิธีการใช้ประโยชน์จากตัวแปร PHP_SELF
โปรดทราบว่าคุณสามารถเพิ่มโค้ด JavaScript ใดๆ ลงในแท็ก <script> ได้! แฮ็กเกอร์สามารถเปลี่ยนเส้นทางผู้ใช้ไปยังไฟล์บนเซิร์ฟเวอร์อื่น และไฟล์นั้นสามารถเก็บโค้ดที่เป็นอันตรายซึ่งสามารถเปลี่ยนแปลงตัวแปรส่วนกลางหรือส่งแบบฟอร์มไปยังที่อยู่อื่นเพื่อบันทึกข้อมูลผู้ใช้ เป็นต้น
จะหลีกเลี่ยง $_SERVER["PHP_SELF"] ได้อย่างไร?
$_SERVER["PHP_SELF"] สามารถหลีกเลี่ยงช่องโหว่ได้โดยใช้ฟังก์ชัน htmlspecialchars()
รหัสแบบฟอร์มควรมีลักษณะดังนี้:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
ฟังก์ชัน htmlspecialchars() แปลงอักขระพิเศษเป็นเอนทิตี HTML ตอนนี้ หากผู้ใช้พยายามใช้ประโยชน์จากตัวแปร PHP_SELF ก็จะได้ผลลัพธ์ดังต่อไปนี้:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
การพยายามหาช่องโหว่ล้มเหลว และไม่มีอันตรายเกิดขึ้น!
ตรวจสอบข้อมูลแบบฟอร์มด้วย PHP
สิ่งแรกที่เราจะทำคือส่งตัวแปรทั้งหมดผ่านฟังก์ชัน htmlspecialchars() ของ PHP
เมื่อเราใช้ฟังก์ชัน htmlspecialchars() ถ้าผู้ใช้พยายามส่งข้อมูลต่อไปนี้ในช่องข้อความ:
<script>location.href('http://www.hacked.com')</script>
- สิ่งนี้จะไม่ถูกดำเนินการ เพราะจะถูกบันทึกเป็นโค้ดหลีกหนี HTML เช่นนี้
<script>location.href('http://www.hacked.com')</script>
ตอนนี้รหัสสามารถแสดงบนหน้าหรือในอีเมลได้อย่างปลอดภัยแล้ว
เราจะทำอีกสองสิ่งเมื่อผู้ใช้ส่งแบบฟอร์ม:
- ตัดอักขระที่ไม่จำเป็น (ช่องว่าง แท็บ ขึ้นบรรทัดใหม่) ออกจากข้อมูลอินพุตของผู้ใช้ (ด้วยฟังก์ชัน PHP trim())
- ลบแบ็กสแลช (\) ออกจากข้อมูลอินพุตของผู้ใช้ (ด้วยฟังก์ชัน PHP stripslashes())
ขั้นตอนต่อไปคือการสร้างฟังก์ชันที่จะทำการตรวจสอบทั้งหมดให้เรา (ซึ่งสะดวกกว่าการเขียนโค้ดเดิมซ้ำแล้วซ้ำอีก)
เราจะตั้งชื่อฟังก์ชัน test_input()
ตอนนี้ เราสามารถตรวจสอบตัวแปร $_POST แต่ละตัวด้วยฟังก์ชัน test_input() และสคริปต์จะมีลักษณะดังนี้:
ตัวอย่าง
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
โปรดสังเกตว่าเมื่อเริ่มต้นสคริปต์ เราจะตรวจสอบว่าได้ส่งแบบฟอร์มโดยใช้ $_SERVER["REQUEST_METHOD"] หรือไม่ หาก REQUEST_METHOD คือ POST แสดงว่าได้ส่งแบบฟอร์มแล้ว และควรตรวจสอบความถูกต้อง หากยังไม่ได้ส่ง ให้ข้ามการตรวจสอบและแสดงแบบฟอร์มเปล่า
อย่างไรก็ตาม ในตัวอย่างข้างต้น ฟิลด์อินพุตทั้งหมดเป็นทางเลือก สคริปต์ทำงานได้ดีแม้ว่าผู้ใช้จะไม่ได้ป้อนข้อมูลใดๆ
ขั้นตอนต่อไปคือการกำหนดให้ป้อนข้อมูลในช่องและสร้างข้อความแสดงข้อผิดพลาดหากจำเป็น