การตรวจสอบแบบฟอร์ม PHP
- หน้าก่อนหน้า PHP ฟอร์มการจัดการ
- หน้าต่อไป PHP ฟอร์มสำหรับบันทึกข้อมูล
นี้และบทดังต่อไปนี้เรียกและอธิบายวิธีการใช้ PHP ในการตรวจสอบข้อมูลฟอร์ม
การตรวจสอบแบบฟอร์ม PHP
คำแนะนำ:ในการจัดการแบบฟอร์ม PHP กรุณาใส่ใจในความปลอดภัย!
หน้าเหล่านี้จะแสดงวิธีการจัดการแบบฟอร์ม PHP อย่างปลอดภัย! การตรวจสอบข้อมูลแบบฟอร์ม HTML อย่างเหมาะสมเป็นสิ่งสำคัญในการป้องกันหรือรับประกันการทำร้ายโดยหากินและสแมร์สเมล
HTML แบบฟอร์มที่เราจะใช้ต่อไปนี้มีช่องว่างข้อมูลหลายชนิด: ช่องว่างข้อมูลที่จำเป็นและไม่จำเป็น ตัวเลือกเดียว และปุ่มส่ง:
แบบฟอร์มที่ขึ้นบนนี้ใช้กฎการตรวจสอบต่อไปนี้
ช่องว่าง | กฎการตรวจสอบ |
---|---|
Name | ควรเลือก ต้องเป็นตัวอักษรและช่องว่าง |
ควรเลือก ต้องเป็นที่อยู่อีเมลที่ถูกต้อง (มี @ และ .) | |
Website | ไม่จำเป็น ถ้ามีต้องเป็น URL ที่ถูกต้อง |
Comment | ไม่จำเป็น ช่องว่างข้อมูลหลายบรรทัด (ข้อความ) |
Gender | ควรเลือก |
เราเริ่มด้วยแบบฟอร์ม HTML ของแบบฟอร์มนี้
ช่องว่างข้อมูลข้อความ
name、email และ website คือช่องว่างข้อมูลข้อความ และ comment คือช่องว่างข้อความ รหัส 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>
ตัวเลือกเดียว
ตัวเลือกเดียว gender คือช่องว่างเลือกเดียว รหัส HTML ของมันคือ
Gender: <input type="radio" name="gender" value="female">Female <input type="radio" name="gender" value="male">Male
รายการช่องว่างแบบฟอร์ม
รหัส HTML ของแบบฟอร์มนี้คือ
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>
เมื่อส่งแบบฟอร์มนี้ จะส่งข้อมูลแบบฟอร์มผ่าน method="post"
$_SERVER["PHP_SELF"] คือตัวแปรอะไร?
$_SERVER["PHP_SELF"] คือตัวแปรสูงสุดที่กลับค่าชื่อไฟล์สคริปที่กำลังปฏิบัติงาน
ดังนั้น,$_SERVER["PHP_SELF"] ส่งข้อมูลแบบฟอร์มไปยังหน้าเดียวกัน ไม่ใช่กระโดดไปยังหน้าอื่น ดังนั้น,ผู้ใช้จะสามารถได้รับข้อมูลของข้อความความผิดพลาดบนหน้าแบบฟอร์ม
ฟังก์ชัน htmlspecialchars() คืออะไร?
ฟังก์ชัน htmlspecialchars() จะแปลงตัวอักษรพิเศษเป็นตัวเลขโฮม์โลแกล
คำแนะนำสำคัญเกี่ยวกับความปลอดภัยของฟอร์ม PHP
ตัวแปร $_SERVER["PHP_SELF"] สามารถถูกใช้โดยแฮ็คเกอร์!
ถ้าเว็บเพจของคุณใช้ PHP_SELF ผู้ใช้สามารถใส่ข้อความต่อไปนี้และทำงานระบบสาธารณะที่เข้ารหัสเจาะเจอ (XSS)
คำแนะนำ:ระบบสาธารณะที่เข้ารหัสเจาะเจอ (Cross-site scripting, XSS) คือชนิดของความไม่ปลอดภัยคอมพิวเตอร์ ที่เกิดขึ้นบ่อยในโปรแกรมเว็บ
จงเล็งไปที่เว็บเพจที่มีชื่อ "test_form.php" ที่มีฟอร์มต่อไปนี้:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
ตอนนี้ ถ้าผู้ใช้เข้าถึง URL ที่ปกติในแถวที่อยู่:
<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>
รหัสนี้เพิ่มเนื้อหาสคริปต์และคำสั่งแจ้งเตือน และเมื่อเว็บเพจนี้โหลดเข้ามา รหัสเจาะเจอจะทำงาน (ผู้ใช้จะเห็นหน้าต่างเตือน) นี่เป็นตัวอย่างของ PHP_SELF ที่ถูกใช้งานอย่างง่ายและไม่มีอันตราย
คุณควรจะได้ตระหนัก สกัดอินเทอร์เน็ตที่สามารถใส่รหัสเจาะเจอเล็กน้อยได้ในแบบจำลอง!โดยหลังจากนั้น โหมดก์สามารถนำผู้ใช้ไปยังเซิร์ฟเวอร์อื่นที่มีไฟล์บนเซิร์ฟเวอร์นี้ และไฟล์นี้มีรหัสร้างร้ายที่สามารถเปลี่ยนตัวแปรโลกหรือส่งฟอร์มไปยังที่อื่นเพื่อบันทึกข้อมูลผู้ใช้ และอื่นๆ
ทางไหนที่จะป้องกันไม่ให้ $_SERVER["PHP_SELF"] ถูกใช้งาน?
ด้วยการใช้ฟังก์ชัน htmlspecialchars() สามารถป้องกันไม่ให้ $_SERVER["PHP_SELF"] ถูกใช้งานได้
รหัสฟอร์มนี้เป็นอย่างนี้:
<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>
- รหัสนี้จะไม่ทำงาน เพราะจะถูกบันทึกในรูปแบบที่ถูกหลีกเลี่ยง อย่างเช่นนี้:
<script>location.href('http://www.hacked.com')</script>
ตอนนี้รหัสนี้จะแสดงขึ้นบนหน้าหรืออีเมลด้วยความปลอดภัย
ขณะที่ผู้ใช้ส่งฟอร์มนี้ เรายังต้องทำสิ่งที่สองอย่างด้วย:
- (ด้วยฟังก์ชัน trim() ของ PHP) ลบอักขระที่ไม่จำเป็นในข้อมูลการเข้าข้อมูลของผู้ใช้ (ช่องว่างเกินไป ตาราง และบรรทัดขึ้น)
- (ด้วยฟังก์ชัน stripslashes() ของ PHP) ลบข้อมูลการเข้าข้อมูลของผู้ใช้ของอักขระตัวเดี่ยว (\\)
ต่อมาเราทำฟังก์ชันตรวจสอบ (เพราะเขียนโค้ดต่อเนื่องมีประสิทธิภาพน้อยกว่านี้)
เราตั้งชื่อฟังก์ชันว่า test_input()。
ตอนนี้,เราสามารถตรวจสอบแต่ละตัวแปร $_POST ด้วยฟังก์ชัน test_input() แล้ว โมดูลนี้เป็นอย่างนี้:
ตัวอย่าง
<?php // กำหนดตัวแปรและตั้งค่าเป็นค่าว่าง $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 ฟอร์มได้ถูกส่ง - และควรทำการตรวจสอบ
อย่างไรก็ตาม ในตัวอย่างที่กล่าวข้างต้น ทุกฟิลด์บันทึกข้อมูลเป็นตัวเลือกได้
ขั้นตอนต่อไปคือทำฟิลด์บันทึกข้อมูลที่บันทึกข้อมูลที่จำเป็น และสร้างข้อความข้อผิดพลาดที่จะใช้เมื่อมีความจำเป็น
- หน้าก่อนหน้า PHP ฟอร์มการจัดการ
- หน้าต่อไป PHP ฟอร์มสำหรับบันทึกข้อมูล