บทช่วยสอนPHP

PHP HOME แนะนำ PHP การติดตั้ง PHP PHP ไวยากรณ์ ความคิดเห็น PHP ตัวแปร PHP PHP Echo / พิมพ์ ประเภทข้อมูล PHP PHP Strings หมายเลข PHP PHP คณิตศาสตร์ ค่าคงที่ PHP ตัวดำเนินการ PHP PHP If...Else...Elseif PHP Switch PHP Loops ฟังก์ชัน PHP PHP Arrays PHP Superglobals PHP RegEx

แบบฟอร์มPHP

การจัดการแบบฟอร์ม PHP การตรวจสอบแบบฟอร์ม PHP ต้องใช้แบบฟอร์ม PHP URL แบบฟอร์ม PHP/อีเมล แบบฟอร์ม PHP เสร็จสมบูรณ์

PHPขั้นสูง

วันที่และเวลา PHP รวม PHP การจัดการไฟล์ PHP ไฟล์ PHP เปิด/อ่าน สร้าง/เขียนไฟล์ PHP อัพโหลดไฟล์ PHP คุกกี้ PHP PHP Sessions ตัวกรอง PHP ตัวกรอง PHP ขั้นสูง ฟังก์ชันเรียกกลับของ PHP PHP JSON ข้อยกเว้น PHP

PHP OOP

PHP OOP คืออะไร คลาส PHP/วัตถุ ตัวสร้าง PHP PHP Destructor PHP Access Modifiers PHP Inheritance ค่าคงที่ PHP PHP Abstract Classes อินเทอร์เฟซ PHP PHP ลักษณะ PHP Static Methods PHP คุณสมบัติคงที่ PHP เนมสเปซ PHP Iterables

ฐานข้อมูลMySQL

ฐานข้อมูล MySQL MySQL Connect MySQL สร้าง DB MySQL สร้างตาราง MySQL แทรกข้อมูล MySQL รับ ID ล่าสุด MySQL แทรกหลายรายการ MySQL ที่เตรียมไว้ MySQL Select Data MySQL Where MySQL สั่งซื้อโดย MySQL ลบข้อมูล ข้อมูลอัพเดต MySQL MySQL Limit Data

PHP XML

PHP XML Parsers PHP SimpleXML Parser PHP SimpleXML - รับ PHP XML Expat PHP XML DOM

PHP - AJAX

บทนำ AJAX AJAX PHP ฐานข้อมูล AJAX AJAX XML AJAX ค้นหาสด AJAX โพล

ตัวอย่างPHP

ตัวอย่าง PHP PHP คอมไพเลอร์ แบบทดสอบ PHP แบบฝึกหัด PHP ใบรับรอง PHP

ข้อมูลอ้างอิงPHP

ภาพรวม PHP PHP Array ปฏิทิน PHP PHP วันที่ ไดเรกทอรี PHP ข้อผิดพลาด PHP ข้อยกเว้น PHP ระบบไฟล์ PHP ตัวกรอง PHP PHP FTP PHP JSON คีย์เวิร์ด PHP PHP Libxml PHP Mail PHP คณิตศาสตร์ PHP เบ็ดเตล็ด PHP MySQLi เครือข่าย PHP การควบคุมเอาต์พุต PHP PHP RegEx PHP SimpleXML PHP Stream PHP String การจัดการตัวแปร PHP PHP XML Parser PHP Zip เขตเวลา PHP

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


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


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

คิดว่าการรักษาความปลอดภัยเมื่อประมวลผลแบบฟอร์ม PHP!

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

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

กฎการตรวจสอบสำหรับแบบฟอร์มด้านบนมีดังนี้:

Field Validation Rules
Name Required. + Must only contain letters and whitespace
E-mail 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/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

การพยายามหาช่องโหว่ล้มเหลว และไม่มีอันตรายเกิดขึ้น!


ตรวจสอบข้อมูลแบบฟอร์มด้วย PHP

สิ่งแรกที่เราจะทำคือส่งตัวแปรทั้งหมดผ่านฟังก์ชัน htmlspecialchars() ของ PHP

เมื่อเราใช้ฟังก์ชัน htmlspecialchars() ถ้าผู้ใช้พยายามส่งข้อมูลต่อไปนี้ในช่องข้อความ:

<script>location.href('http://www.hacked.com')</script>

- สิ่งนี้จะไม่ถูกดำเนินการ เพราะจะถูกบันทึกเป็นโค้ดหลีกหนี HTML เช่นนี้

<script>location.href('http://www.hacked.com')</script>

ตอนนี้รหัสสามารถแสดงบนหน้าหรือในอีเมลได้อย่างปลอดภัยแล้ว

เราจะทำอีกสองสิ่งเมื่อผู้ใช้ส่งแบบฟอร์ม:

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

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

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