0Pricing
PHP Academy · บทเรียน

การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้

ลบอักขระอันตรายด้วย 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');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() เทียบกับ htmlspecialchars()

ทั้งสองฟังก์ชันใช้หลีกอักขระ HTML แต่ htmlentities จะแปลงอักขระที่เกี่ยวข้องทั้งหมด ส่วน htmlspecialchars จะแปลงเฉพาะอักขระที่อันตรายที่สุดห้าตัวเท่านั้น:

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. GET กับ POST: ควรใช้แต่ละแบบเมื่อใด
  2. การอ่านข้อมูลแบบฟอร์มด้วย Superglobals
  3. เทคนิคการตรวจสอบข้อมูลนำเข้า
  4. การทำความสะอาดข้อมูลนำเข้าจากผู้ใช้
← กลับไปที่ PHP Academy