การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้
ลบอักขระอันตรายด้วย htmlspecialchars และ filter_input
การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้ เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
การทำความสะอาดข้อมูลเทียบกับการตรวจสอบความถูกต้อง
การตรวจสอบความถูกต้อง จะตรวจสอบว่าข้อมูลเป็นไปตามข้อกำหนดหรือไม่ (และปฏิเสธข้อมูลหากไม่เป็นไปตามนั้น)
การทำความสะอาดข้อมูล จะลบหรือเข้ารหัสอักขระอันตรายออกจากข้อมูล เพื่อให้สามารถใช้งานได้อย่างปลอดภัย
จำเป็นต้องทำทั้งสองอย่าง — ตรวจสอบความถูกต้องก่อน แล้วจึงทำความสะอาดข้อมูลสำหรับผลลัพธ์
htmlspecialchars() สำหรับผลลัพธ์ HTML
หลีกอักขระในผลลัพธ์ก่อนแทรกลงใน HTML เสมอ เพื่อป้องกัน XSS:
<?php
$name = '<script>alert(1)</script>';
// Dangerous — executes script:
// echo $name;
// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert(1)</script>htmlentities() เทียบกับ htmlspecialchars()
ทั้งสองฟังก์ชันใช้หลีกอักขระ HTML แต่ htmlentities จะแปลงอักขระที่เกี่ยวข้องทั้งหมด ส่วน htmlspecialchars จะแปลงเฉพาะอักขระที่อันตรายที่สุดห้าตัวเท่านั้น:
<?php
$str = '<b>café</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8โหมด FILTER_SANITIZE_* ของ filter_var
โหมดการทำความสะอาดข้อมูลของ filter_var จะลบเนื้อหาที่เป็นอันตราย:
<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com
$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;strip_tags()
ลบแท็ก HTML ออกจากสตริง โดยเลือกเก็บแท็กที่อนุญาตไว้ได้:
<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';
// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)
// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>การทำความสะอาดข้อมูลสำหรับ SQL
อย่าทำความสะอาด SQL ด้วยฟังก์ชันจัดการสตริง — ให้ใช้คำสั่งที่เตรียมไว้เสมอ แนวทางที่ถูกต้องคือ:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";
// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();addslashes() เทียบกับคำสั่งที่เตรียมไว้
addslashes() จะหลีกอักขระแบ็กสแลชและเครื่องหมายคำพูด แต่ไม่ปลอดภัยสำหรับ SQL ให้ใช้คำสั่งที่เตรียมไว้ของ PDO แทน addslashes() อาจยังมีประโยชน์สำหรับจุดประสงค์ที่ไม่เกี่ยวกับ SQL เช่น การสร้างสตริง JavaScript:
<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";การทำความสะอาดชื่อไฟล์
ลบอักขระที่เป็นอันตรายออกจากชื่อไฟล์ที่อัปโหลด:
<?php
function sanitizeFilename(string $name): string {
// Remove path traversal chars and other dangerous ones
$name = basename($name); // strip any path
$name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
$name = preg_replace('/_{2,}/', '_', $name); // collapse underscores
return strtolower($name);
}
echo sanitizeFilename('../../../etc/passwd'); // etc_passwd
echo sanitizeFilename('My Photo (1).JPG'); // my_photo_1_.jpgการแปลงเป็นจำนวนเต็มสำหรับ ID
วิธีทำความสะอาดข้อมูลตัวเลข ID ที่ง่ายที่สุดคือแปลงเป็นจำนวนเต็ม ซึ่งจะตัดเนื้อหาที่ไม่ใช่ตัวเลขออก:
<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";
// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');
// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');บริบทของผลลัพธ์มีความสำคัญ
บริบทของผลลัพธ์แต่ละแบบต้องใช้การหลีกอักขระที่แตกต่างกัน:
- เนื้อหา HTML →
htmlspecialchars() - แอตทริบิวต์ HTML →
htmlspecialchars(ENT_QUOTES) - JSON/JavaScript →
json_encode() - พารามิเตอร์ URL →
urlencode() - SQL → คำสั่งที่เตรียมไว้
urlencode และ rawurlencode
เข้ารหัสค่าเพื่อใช้ใน URL:
<?php
$search = 'hello world & PHP';
echo urlencode($search);
// hello+world+%26+PHP (+ for spaces)
echo rawurlencode($search);
// hello%20world%20%26%20PHP (RFC 3986 — use in paths)
$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;ตรวจสอบอย่างรวดเร็ว
ฟังก์ชันใดเป็นวิธีที่ถูกต้องในการป้องกันการแทรกคำสั่ง SQL เมื่อใช้ข้อมูลจากผู้ใช้ในคำค้นฐานข้อมูล
สรุป: การทำความสะอาดข้อมูลนำเข้า
กฎการทำความสะอาดข้อมูล:
- ผลลัพธ์ HTML →
htmlspecialchars(ENT_QUOTES, 'UTF-8') - SQL → คำสั่งที่เตรียมไว้ ห้ามใช้การหลีกอักขระด้วยสตริง
- URL →
urlencode()หรือrawurlencode() - ชื่อไฟล์ → ลบด้วย Regex และใช้
basename() - ID จำนวนเต็ม → แปลงด้วย
(int) - แท็ก → ใช้
strip_tags()เพื่อกรองแท็กที่อนุญาต
คำถามที่พบบ่อย
บทเรียน “การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้”
ลบอักขระอันตรายด้วย htmlspecialchars และ filter_input คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม
ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- GET กับ POST: ควรใช้แต่ละแบบเมื่อใด
- การอ่านข้อมูลแบบฟอร์มด้วย Superglobals
- เทคนิคการตรวจสอบข้อมูลนำเข้า
- การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้