การผ่านรายการนี้เป็นการอ้างอิงแบบรวมจาก SO Documentation เบต้าซึ่งกำลังออฟไลน์
ปัญหา
การเขียนสคริปต์ข้ามไซต์เป็นการเรียกใช้โค้ดจากระยะไกลโดยเว็บไคลเอ็นต์ เว็บแอปพลิเคชันใด ๆ อาจเปิดเผยตัวเองกับ XSS หากนำข้อมูลจากผู้ใช้และส่งออกโดยตรงบนหน้าเว็บ หากอินพุตมี HTML หรือ JavaScript โค้ดระยะไกลสามารถเรียกใช้งานได้เมื่อเว็บไคลเอ็นต์แสดงผลเนื้อหานี้
ตัวอย่างเช่นหากฝ่ายที่สามมีไฟล์ JavaScript:
// http://example.com/runme.js
document.write("I'm running");
และแอปพลิเคชัน PHP ส่งเอาต์พุตสตริงโดยตรงเข้ามาโดยตรง:
<?php
echo '<div>' . $_GET['input'] . '</div>';
หากมีพารามิเตอร์ GET ที่ไม่ถูกตรวจสอบ<script src="http://example.com/runme.js"></script>
แล้วผลลัพธ์ของสคริปต์ PHP จะเป็น:
<div><script src="http://example.com/runme.js"></script></div>
JavaScript ของบุคคลที่สามจะทำงานและผู้ใช้จะเห็น "ฉันกำลังทำงาน" บนหน้าเว็บ
สารละลาย
ตามกฎทั่วไปอย่าเชื่อถืออินพุตที่มาจากลูกค้า GET, POST และคุกกี้ทุกค่าสามารถเป็นอะไรก็ได้และควรได้รับการตรวจสอบ เมื่อแสดงผลของค่าใด ๆ เหล่านี้ให้หลีกเลี่ยงเพื่อไม่ให้มีการประเมินในลักษณะที่ไม่คาดคิด
โปรดทราบว่าแม้ในข้อมูลแอปพลิเคชันที่ง่ายที่สุดสามารถเคลื่อนย้ายไปมาได้และมันก็ยากที่จะติดตามทุกแหล่ง ดังนั้นจึงเป็นวิธีที่ดีที่สุดที่จะเสมอหนีเอาท์พุท
PHP มีวิธีหนีผลลัพธ์ขึ้นอยู่กับบริบท
ฟังก์ชั่นตัวกรอง
PHPs ฟังก์ชั่นกรองช่วยให้การป้อนข้อมูลไปยังสคริปต์ PHP ที่จะปรุงแต่งหรือการตรวจสอบในหลายวิธี มีประโยชน์เมื่อบันทึกหรือแสดงผลอินพุตไคลเอ็นต์
การเข้ารหัส HTML
htmlspecialchars
จะแปลง "อักขระพิเศษ HTML" เป็นการเข้ารหัส HTML ซึ่งหมายความว่าจะไม่ถูกประมวลผลเป็น HTML มาตรฐาน ในการแก้ไขตัวอย่างก่อนหน้าของเราโดยใช้วิธีนี้:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
จะส่งออก:
<div><script src="http://example.com/runme.js"></script></div>
ทุกสิ่งที่อยู่ภายใน<div>
แท็กจะไม่ถูกตีความเป็นเบราว์เซอร์ของแท็ก JavaScript แต่จะเป็นโหนดข้อความธรรมดา ผู้ใช้จะเห็นอย่างปลอดภัย:
<script src="http://example.com/runme.js"></script>
การเข้ารหัส URL
เมื่อแสดงผล URL ที่สร้างขึ้นแบบไดนามิก PHP จะมีurlencode
ฟังก์ชั่นในการแสดงผล URL ที่ถูกต้องอย่างปลอดภัย ตัวอย่างเช่นหากผู้ใช้สามารถป้อนข้อมูลที่กลายเป็นส่วนหนึ่งของพารามิเตอร์ GET อื่น:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
อินพุตที่เป็นอันตรายใด ๆ จะถูกแปลงเป็นพารามิเตอร์ URL ที่เข้ารหัส
ใช้ไลบรารีภายนอกแบบพิเศษหรือรายการ OWASP AntiSamy
บางครั้งคุณอาจต้องการส่ง HTML หรือใส่รหัสอื่น ๆ คุณจะต้องเก็บรายการคำที่ได้รับอนุญาต (บัญชีขาว) และไม่ได้รับอนุญาต (บัญชีดำ)
คุณสามารถดาวน์โหลดรายการมาตรฐานที่สามารถใช้ได้ที่เว็บไซต์ OWASP AntiSamy แต่ละรายการเหมาะสำหรับการโต้ตอบเฉพาะประเภท (ebay api, tinyMCE, ฯลฯ ... ) และมันก็เป็นโอเพนซอร์ซ
มีห้องสมุดที่มีอยู่เพื่อกรอง HTML และป้องกันการโจมตี XSS สำหรับกรณีทั่วไปและดำเนินการอย่างน้อยเช่นเดียวกับรายการ AntiSamy ที่ใช้งานง่ายมาก ตัวอย่างเช่นคุณมีตัวกรอง HTML