การตรวจสอบแบบฟอร์ม PHP

นี้และบทดังต่อไปนี้เรียกและอธิบายวิธีการใช้ PHP ในการตรวจสอบข้อมูลฟอร์ม

การตรวจสอบแบบฟอร์ม PHP

คำแนะนำ:ในการจัดการแบบฟอร์ม PHP กรุณาใส่ใจในความปลอดภัย!

หน้าเหล่านี้จะแสดงวิธีการจัดการแบบฟอร์ม PHP อย่างปลอดภัย! การตรวจสอบข้อมูลแบบฟอร์ม HTML อย่างเหมาะสมเป็นสิ่งสำคัญในการป้องกันหรือรับประกันการทำร้ายโดยหากินและสแมร์สเมล

HTML แบบฟอร์มที่เราจะใช้ต่อไปนี้มีช่องว่างข้อมูลหลายชนิด: ช่องว่างข้อมูลที่จำเป็นและไม่จำเป็น ตัวเลือกเดียว และปุ่มส่ง:

แบบฟอร์มที่ขึ้นบนนี้ใช้กฎการตรวจสอบต่อไปนี้

ช่องว่าง กฎการตรวจสอบ
Name ควรเลือก ต้องเป็นตัวอักษรและช่องว่าง
E-mail ควรเลือก ต้องเป็นที่อยู่อีเมลที่ถูกต้อง (มี @ และ .)
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>

ตอนนี้รหัสนี้จะแสดงขึ้นบนหน้าหรืออีเมลด้วยความปลอดภัย

ขณะที่ผู้ใช้ส่งฟอร์มนี้ เรายังต้องทำสิ่งที่สองอย่างด้วย:

  1. (ด้วยฟังก์ชัน trim() ของ PHP) ลบอักขระที่ไม่จำเป็นในข้อมูลการเข้าข้อมูลของผู้ใช้ (ช่องว่างเกินไป ตาราง และบรรทัดขึ้น)
  2. (ด้วยฟังก์ชัน 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 ฟอร์มได้ถูกส่ง - และควรทำการตรวจสอบ

อย่างไรก็ตาม ในตัวอย่างที่กล่าวข้างต้น ทุกฟิลด์บันทึกข้อมูลเป็นตัวเลือกได้

ขั้นตอนต่อไปคือทำฟิลด์บันทึกข้อมูลที่บันทึกข้อมูลที่จำเป็น และสร้างข้อความข้อผิดพลาดที่จะใช้เมื่อมีความจำเป็น