ในบทนี้ เราจะแนะนำวิธีการใช้ PHP เพื่อตรวจสอบข้อมูลแบบฟอร์มที่ลูกค้าส่งมา
เราจำเป็นต้องคำนึงถึงความปลอดภัยเมื่อต้องจัดการกับแบบฟอร์ม PHP ในบทนี้ เราจะสาธิตการประมวลผลข้อมูลแบบฟอร์ม PHP อย่างปลอดภัย เพื่อป้องกันแฮกเกอร์และสแปม เราจำเป็นต้องดำเนินการตรวจสอบความปลอดภัยของข้อมูลในแบบฟอร์ม |
รูปแบบ HTML ที่อธิบายในบทนี้ประกอบด้วยช่องป้อนข้อมูลต่อไปนี้: ช่องข้อความที่จำเป็นและตัวเลือก ปุ่มตัวเลือก และปุ่มส่ง:
กฎการตรวจสอบแบบฟอร์มข้างต้นมีดังนี้:
สนาม | กฎการตรวจสอบ |
---|---|
ชื่อ | ต้อง. +มีได้เฉพาะตัวอักษรและช่องว่างเท่านั้น |
อีเมล | ต้อง. + ต้องเป็นที่อยู่อีเมลที่ถูกต้อง (มี '@' และ '.') |
URL | ไม่จำเป็น. หากมี จะต้องมี URL ที่ถูกต้อง |
หมายเหตุ | ไม่จำเป็น. ช่องป้อนข้อมูลหลายบรรทัด (ช่องข้อความ) |
เพศ | ต้อง. ต้องเลือกอย่างใดอย่างหนึ่ง |
ขั้นแรกเรามาดูโค้ดรูปแบบ HTML ล้วนๆ:
ช่อง "ชื่อ", "อีเมล" และ "เว็บไซต์" เป็นองค์ประกอบการป้อนข้อความ และช่อง "หมายเหตุ" คือพื้นที่ข้อความ รหัส HTML มีลักษณะดังนี้:
"ชื่อ": <input type="text" name="name">อีเมล: <input type="text" name="email">เว็บไซต์: <input type="text" name="website">หมายเหตุ : <textarea name="comment" rows="5" cols="40"></textarea>
ช่อง "เพศ" เป็นปุ่มตัวเลือกและโค้ด HTML มีลักษณะดังนี้:
เพศ:<input type="radio" name="gender" value="Female">หญิง<input type="radio" name="gender" value="male">ชาย
โค้ดฟอร์ม HTML มีลักษณะดังนี้:
<รูปแบบวิธีการ = "โพสต์" การกระทำ = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
แบบฟอร์มใช้ วิธี method="post" ในการส่งข้อมูล
ตัวแปร $_SERVER["PHP_SELF"] คืออะไร $_SERVER["PHP_SELF"] เป็นตัวแปรส่วนกลางขั้นสูงที่ส่งคืนชื่อไฟล์ของสคริปต์ที่รันอยู่ในปัจจุบันและเกี่ยวข้องกับรูทเอกสาร |
ดังนั้น $_SERVER["PHP_SELF"] จะส่งข้อมูลแบบฟอร์มไปยังหน้าปัจจุบัน แทนที่จะข้ามไปยังหน้าอื่น
วิธีการ htmlspecialchars() คืออะไร ฟังก์ชัน htmlspecialchars() จะแปลงอักขระที่กำหนดไว้ล่วงหน้าบางตัวให้เป็นเอนทิตี HTML อักขระที่กำหนดไว้ล่วงหน้าคือ: & (เครื่องหมาย) กลายเป็น & " (เครื่องหมายคำพูดคู่) กลายเป็น " ' (เครื่องหมายคำพูดเดี่ยว) กลายเป็น ' < (น้อยกว่า) กลายเป็น < > (มากกว่า) กลายเป็น> |
แฮกเกอร์อาจใช้ตัวแปร $_SERVER["PHP_SELF"] ได้!
เมื่อแฮกเกอร์ใช้ลิงก์ HTTP แบบข้ามไซต์เพื่อโจมตี ตัวแปรเซิร์ฟเวอร์ $_SERVER["PHP_SELF"] จะถูกฝังอยู่ในสคริปต์ด้วย เหตุผลก็คือ การเขียนสคริปต์ข้ามไซต์ถูกต่อท้ายเส้นทางของไฟล์ปฏิบัติการ ดังนั้นสตริง $_SERVER["PHP_SELF"] จะมีโค้ดโปรแกรม JavaScript อยู่ด้านหลังลิงก์ HTTP
XSS เรียกอีกอย่างว่า CSS (Cross-Site Script) ซึ่งเป็นการโจมตีด้วยสคริปต์ข้ามไซต์ ผู้โจมตีที่เป็นอันตรายจะแทรกโค้ด HTML ที่เป็นอันตรายลงในเว็บเพจ เมื่อผู้ใช้เรียกดูเพจ โค้ด HTML ที่ฝังอยู่ในเว็บเพจจะถูกดำเนินการ เพื่อให้บรรลุวัตถุประสงค์พิเศษของผู้ใช้ที่เป็นอันตราย |
ระบุชื่อไฟล์แบบฟอร์มต่อไปนี้ "test_form.php":
<รูปแบบวิธีการ = "โพสต์" การกระทำ = "<?php echo $_SERVER["PHP_SELF"];?>">
ตอนนี้เราใช้ URL เพื่อระบุที่อยู่การส่ง "test_form.php" และโค้ดด้านบนได้รับการแก้ไขดังนี้:
<รูปแบบวิธีการ = "โพสต์" การกระทำ = "test_form.php">
นั่นคงจะดี
อย่างไรก็ตาม ให้พิจารณาว่าผู้ใช้จะป้อนที่อยู่ต่อไปนี้ลงในแถบที่อยู่ของเบราว์เซอร์:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('ถูกแฮ็ก')%3C/script%3E
URL ด้านบนจะถูกแยกวิเคราะห์เป็นโค้ดต่อไปนี้และดำเนินการ:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
เพิ่มแท็กสคริปต์ลงในโค้ดแล้ว และเพิ่มคำสั่งแจ้งเตือนแล้ว รหัส Javascript นี้จะถูกดำเนินการเมื่อมีการโหลดหน้าเว็บ (ผู้ใช้จะเห็นกล่องป๊อปอัป) นี่เป็นเพียงตัวอย่างง่ายๆ ว่าแฮกเกอร์สามารถใช้ประโยชน์จากตัวแปร PHP_SELF ได้อย่างไร
โปรดทราบว่า คุณสามารถเพิ่มโค้ด JavaScript ใดก็ได้ภายในแท็ก <script>! แฮกเกอร์สามารถใช้สิ่งนี้เพื่อเปลี่ยนเส้นทางเพจไปยังเพจบนเซิร์ฟเวอร์อื่น ไฟล์โค้ดเพจสามารถป้องกันโค้ดที่เป็นอันตรายได้ โค้ดสามารถแก้ไขตัวแปรส่วนกลางหรือรับข้อมูลแบบฟอร์มของผู้ใช้
$_SERVER["PHP_SELF"] สามารถหลีกเลี่ยงได้โดยใช้ฟังก์ชัน htmlspecialchars()
รหัสแบบฟอร์มมีลักษณะดังนี้:
<รูปแบบวิธีการ = "โพสต์" การกระทำ = "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() แปลงอักขระที่กำหนดไว้ล่วงหน้าบางตัวให้เป็นเอนทิตี HTML ตอนนี้หากผู้ใช้ต้องการใช้ตัวแปร PHP_SELF ผลลัพธ์ที่ได้จะเป็นดังนี้:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
ความพยายามที่จะใช้ประโยชน์จากการหาประโยชน์นี้ล้มเหลว!
ขั้นแรก เราประมวลผลข้อมูลทั้งหมดที่ผู้ใช้ส่งมาผ่านฟังก์ชัน htmlspecialchars() ของ PHP
เมื่อเราใช้ฟังก์ชัน htmlspecialchars() ผู้ใช้จะพยายามส่งฟิลด์ข้อความต่อไปนี้:
<script>location.href('http://www.codercto.com')</script>
โค้ดนี้จะไม่ถูกดำเนินการเนื่องจากจะถูกบันทึกเป็นโค้ด HTML Escape ดังนี้:
<script>location.href('http://www.codercto.com')</script>
โค้ดข้างต้นมีความปลอดภัยและสามารถแสดงได้ตามปกติบนเพจหรือแทรกลงในอีเมล
เมื่อผู้ใช้ส่งแบบฟอร์ม เราจะดำเนินการสองสิ่งต่อไปนี้:
ใช้ฟังก์ชัน PHP trim() เพื่อลบอักขระที่ไม่จำเป็น (เช่น การเว้นวรรค แท็บ การขึ้นบรรทัดใหม่) ในข้อมูลที่ผู้ใช้ป้อน
ใช้ฟังก์ชัน PHP stripslashes() เพื่อลบแบ็กสแลช () ออกจากข้อมูลที่ผู้ใช้ป้อน
ต่อไป เรามาเขียนฟังก์ชันการกรองเหล่านี้ในฟังก์ชันที่เรากำหนดเอง ซึ่งสามารถปรับปรุงการนำโค้ดกลับมาใช้ซ้ำได้อย่างมาก
ตั้งชื่อฟังก์ชัน test_input()
ตอนนี้เราสามารถใช้ฟังก์ชัน test_input() เพื่อตรวจจับตัวแปรทั้งหมดใน $_POST โค้ดสคริปต์จะเป็นดังนี้:
<?php//กำหนดตัวแปรและตั้งค่าเป็นค่าว่างตามค่าเริ่มต้น $name= $email= $gender= $comment= $website= ""; if($_SERVER["REQUEST_METHOD"]== "POST") { $name= test_input($_POST["name"]); $email= test_input($_POST["email"]); $เว็บไซต์= test_input($_POST["เว็บไซต์"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= ตัดแต่ง ($data); $data= stripslashes($data); $data= htmlspecialchars($data); return$data;}?>
โปรดทราบว่าเมื่อเรารันสคริปต์ข้างต้น เราจะใช้ $_SERVER["REQUEST_METHOD"] เพื่อตรวจสอบว่าแบบฟอร์มถูกส่งไปแล้วหรือไม่ หาก REQUEST_METHOD เป็น POST แบบฟอร์มจะถูกส่ง และข้อมูลจะได้รับการตรวจสอบความถูกต้อง หากไม่ได้ส่งแบบฟอร์ม การตรวจสอบความถูกต้องจะถูกข้ามและแสดงเป็นค่าว่าง
การใช้รายการอินพุตในตัวอย่างข้างต้นเป็นทางเลือกและสามารถแสดงผลได้ตามปกติ แม้ว่าผู้ใช้จะไม่ได้ป้อนข้อมูลใดๆ ก็ตาม
ในบทต่อไป เราจะแนะนำวิธีการตรวจสอบข้อมูลที่ป้อนโดยผู้ใช้