การป้องกันช่องโหว่ XSS
ในปัจจุบันการป้องกันช่องโหว่ cross-site scripting อาศัยการแปลงข้อมูลตัวอักขระพิเศษของภาษาเอชทีเอ็มแอลทุกตัวที่เป็นไปได้ว่าอาจเป็นข้อมูลมุ่งร้าย โดยทำก่อนที่เว็บแอพพลิเคชั่น (หรือสคริปต์ฝั่งไคลเอ็นท์) จะแสดงผล และภาษาโปรแกรมมิ่งหลาย ๆ ตัวมีฟังก์ชั่นหรือไลบรารีที่ช่วยในการการแปลงข้อมูลนี้ (ในบริบทนี้ยังเรียกด้วยว่า quoting หรือ escaping)

ตัวอย่างของการทำ quoting แสดงตัวอย่างข้างล่างนี้ จากภายในอินเตอร์พรีเตอร์ของ Python เอง

<script>alert(’xss’);</script>
จากตัวอย่างข้างบนนี้ คำสั่ง print ในบรรทัดแรกได้สร้างสคริปต์ฝั่งไคลเอ็นท์ที่สามารถเอ็กซิคิวท์ได้ แต่ในคำสั่งที่สองแสดงผลเป็นสายอักขระหนึ่งซึ่งเป็นรูปแบบที่ได้เปลี่ยนแปลงข้อมูลเอชทีเอ็มแอลจากเดิมแล้ว รูปแบบอักขระเหล่านี้จะปรากฏเป็นตัวอักขระจริงในเบราว์เซอร์ แทนที่จะเป็นความหมายพิเศษแบบคำสั่งเอชทีเอ็มแอล วิธีนี้ช่วยป้องกันไม่ให้สามารถใส่สคริปต์ใด ๆ เข้าไปในหน้าแสดงผลเอชทีเอ็มแอลได้ นอกจากนี้ยังป้องกันไม่ให้ผู้ใช้สามารถป้อนข้อมูลในรูปแบบเอชทีเอ็มแอลมุ่งร้ายเข้าไปอีกด้วย
ปัญหาพื้นฐานเกี่ยวกับการหลีกเลี่ยงช่องโหว่ XSS คือสถานการณ์มีความแตกต่างกัน ในสถานการณ์หนึ่งความต้องการและปัญหาก็เปลี่ยนแปลงไป ตัวอย่างเช่น เมื่อข้อมูลที่รับจากผู้ใช้ส่งมายัง src attribute ของไฮเปอร์ลิงค์ cgi.escape() ก็ไม่เพียงพอสำหรับการป้องกัน เช่น จะมีการเพิ่มรูปหนึ่งเข้าไปในหน้าเว็บที่แสดงรูปต่าง ๆ ในรูปแบบเช่นนี้

ผู้โจมตีสามารถใส่ “doesntexist.jpg’ onerror=’alert(document.cookie)” เข้าไปในอีเว้นท์ซึ่งจะทำงานเมื่อเบราว์เซอร์ ไม่สามารถโหลดไฟล์ “doesntexist.jpg” และเอ็กซิคิวท์โค้ดดังกล่าว
ถ้ามีใครคนหนึ่งได้ใช้ฟังก์ชั่นอย่างเช่น cgi.escape() (ซึ่งมาพร้อมกับ Python) อีกคนหนึ่งก็จะพยายามเปลี่ยนอักขระทั้งหมดยกเว้นอักขระที่รู้กันดีอยู่แล้วว่าปลอดภัยทั้งหมดให้เป็น HTML entity ที่มีค่าเท่ากัน เบราว์เซอร์ใช้อัลกอริทึมในการวิเคราะห์คำในภาษาเอชทีเอ็มแอลที่ซับซ้อน (และมักจะมีข้อผิดพลาด) ดังนั้นจึงยากที่จะทำนายได้ว่าอักขระตัวใดที่จะเป็นอักขระพิเศษ โดยเฉพาะการสนับสนุนชุดอักขระ Unicode ของเบราว์เซอร์ ซึ่งอาจทำให้แอพพลิเคชั่นหนึ่งถูกโจมตีโดยช่องโหว่ XSS ได้ ถ้าอัลกอริทึมที่ใช้ในการแปลงข้อมูลเอชทีเอ็มแอลตรวจสอบเฉพาะอักขระที่อาจจะมีอันตรายเท่านั้น
จากที่กล่าวไว้ข้างต้น ผลลัพธ์ที่ไม่ดีที่ตามมาจากการแก้ไขช่องโหว่นี้คือ ผู้ใช้ไม่สามารถฝังโค้ดเอชทีเอ็มแอลที่ไม่มีเจตนาร้ายลงไปในหน้าเว็บต่าง ๆ ได้ เนื่องจากมาตรฐานเอชทีเอ็มแอลไม่มีกลไกในการปิดการทำงานของสคริปต์ฝั่งไคลเอ็นท์ในส่วนต่าง ๆ ของหน้าเว็บโดยเฉพาะได้ ดังนั้นจึงยากที่จะกำจัดสคริปต์ออกจากโค้ดเอชทีเอ็มแอลได้อย่างน่าเชื่อถือ วิธีการที่น่าเชื่อถือมากที่สุดสำหรับเว็บแอพพลิเคชั่นคือการวิเคราะห์คำในโค้ดเอชทีเอ็มแอล ขจัดคำสั่งเอชทีเอ็มแอลและอะทริบิวท์ที่ไม่อยู่ในรายการคำสั่งที่ปลอดภัย จากนั้นจึงแสดงผลเอชทีเอ็มแอลที่ถูกต้องออกมา
(more…)