การป้องกันช่องโหว่ Cross-Site Scripting (XSS)

application_javascriptXSS เป็นช่องโหว่ที่เป็นอันตรายต่อผู้ใช้งานเว็บแอปพลิเคชัน เพราะเป็นช่องทางให้ผู้ไม่หวังดีสามารถขโมยข้อมูลที่เป็นความลับด้วยการใส่ JavaScript ลงไปในเว็บแอปพลิเคชัน การป้องกัน XSS นั้นสามารถทำได้ไม่ยากแต่ต้องใช้รอบคอบอย่างมาก บทความนี้จะอธิบายถึงสาเหตุและขั้นตอนการป้องกันการโจมตีชนิด Cross-Site Scripting (XSS)

สาเหตุของ XSS

ก่อนที่จะพูดถึงวิธีการป้องกันช่องโหว่ประเภท XSS เราต้องเข้าใจถึงสาเหตุของ XSS ก่อน จากที่ได้อธิบายไปในบทความ การโจมตีและช่องโหว่ประเภท Cross-site Scripting (XSS) ช่องโหว่ทั้ง 3 ประเภท (Reflected, Stored, และ DOM-based XSS) เกิดจากการที่ผู้พัฒนาเว็บแอปพลิเคชันไม่ได้ทำการตรวจสอบข้อมูลที่ได้รับมาจากผู้ใช้งานให้ดี ก่อนนำไปแสดงผลให้กับผู้ใช้งานคนอื่น ดังนั้น หากต้องการป้องกันการเกิดช่องโหว่ประเภทนี้ ต้องเริ่มต้นที่การตรวจสอบและคัดกรองข้อมูลที่ได้รับมาจากผู้ใช้งานให้ดี (หลักการป้องกันเดียวกับ SQL Injection)

การป้องกันช่องโหว่ XSS

1. วิธีการป้องกันช่องโหว่ประเภท XSS ที่ดีที่สุดคือการไม่นำข้อมูลที่ได้รับมาจากผู้ใช้งานมาแสดงผลใน tag ที่เปิดโอกาสให้เรียกใช้งาน  JavaScript ขึ้นได้มา โดย OWASP XSS Prevention Cheat Sheet ได้แนะนำว่าไม่ให้นำข้อมูลที่ได้รับมาจากผู้ใช้งานใส่ลงใน tag ด้านล่าง (ที่มา XSS (Cross Site Scripting) Prevention Cheat Sheet)

<script>...NEVER PUT UNTRUSTED DATA HERE...</script>   in script tag

<!--...NEVER PUT UNTRUSTED DATA HERE...--> in comment tag
    
<div ...NEVER PUT UNTRUSTED DATA HERE...=test /> as attribute
   
<NEVER PUT UNTRUSTED DATA HERE... href="/test" />  as html tag
 
<style>...NEVER PUT UNTRUSTED DATA HERE...</style> in style tag

2. ในบางเว็บแอปพลิเคชัน การไม่แสดงผลข้อมูลที่ได้รับมาจากผู้ใช้งานนั้นเป็นไปไม่ได้ (ตัวอย่างเช่น webboard หรือ forum จำเป็นต้องนำข้อมูลที่ได้รับมาจากผู้ใช้งานมาแสดงผล) ดังนั้น การป้องกัน XSS มีเพียงวิธีเดียวคือการคัดกรองข้อมูลก่อนนำไปแสดงผล เพื่อให้มันใจว่าข้อมูลที่ได้รับมาไม่มี JavaScript ฝังอยู่ เราเรียกวิธีการนี้ว่า data sanitizing (การตัด keyword หรือ tag ออก) และ HTML escaping (การ encode อักขระพิเศษให้อยู่ใน format ของ HTML encode)

  • data sanitizing ตัวอย่างเช่น หากข้อมูลที่ได้รับมาจากผู้ใช้งานมี tag <script></script> อยู่ ให้ตัด tag นี้ออก
  • HTML escaping หากเจออักขระพิเศษ เช่น < ให้ทำการแปลงเป็น &lt; เป็นต้น

การทำ data sanitising และ HTMLescaping เป็นเรื่องยาก นักพัฒนาเว็บแอปพลิเคชันไม่ควรที่จะเขียน function  หรือ library ในการทำ sanitizing และ escaping ขึ้นมาเอง แต่ควรเลือกใช้ library หรือ function ที่ถูกเขียนโดยผู้เชี่ยวชาญจะปลอดภัยกว่า

3. หากต้องการใส่ข้อมูลลงใน tag ต้องห้ามตามข้อที่ 1 เช่น <script></scrip> หรือ <style></style> ก็ต้องทำ JavaScript, Attribute, และ CSS escpaing เพื่อให้แน่ใจว่า ข้อมูลที่ได้รับจากผู้ใช้งานจะไม่สามารถเรียกใช้งาน JavaScript ได้ ผู้สนใจต้องการรายละเอียดเกี่ยวกับการทำ escaping อื่น ๆ สามารถไปอ่านต่อได้ที่เอกสารอ้างอิง

จุดมุ่งหมายของผู้ที่ใช้ช่องโหว่ XSS ก็คือการขโมยข้อมูลสำคัญของผู้ใช้งานคนอื่น ซึ่งส่วนใหญ่ก็คือ web cookie นั่นเอง การที่ผู้ไม่หวังดีสามารถขโมย web cookie ของผู้ใช้งานคนอื่นได้นั้น เป็นการเปิดโอกาสให้เข้าควบคุม user account ของผู้ที่ถูกขโมย ดังนั้น ในปี 2002 Microsoft จึงได้ทำการสร้าง HttpOnly Cookie ขึ้นมาเพื่อช่วยแก้ไขปัญหา XSS

HttpOnly Cookie

HttpOnly เป็น feature ที่มีอยู่ในเว็บเบราเซอร์ทุกชนิดในปัจจุบัน หลักการคือ หากเว็บเบราเซอร์ได้รับ flag HttpOnly Cookie จากเว็บไซต์ เว็บเบราเซอร์จะไม่อนุญาตให้ JavaScript สามารถเข้าถึงข้อมูล web cookie ของผู้ใช้งานได้ ดังนั้น document.cookie จึงไม่สามารถเรียกใช้งานได้

PHP version 5.2 มี HttpOnly Cookie นักพัฒนาสามารถไปตั้งค่าได้ที่ php.ini โดยกำหนดค่าให้

session.cookie_httponly = True

Web cookie ทั้งหมดก็จะไม่สามารถเข้าถึงได้ผ่านทาง JavaScript ซึ่งจะช่วยลดความรุนแรงของช่องโหว่ประเภท XSS ได้เป็นอย่างมาก

อ้างอิง

1. XSS (Cross Site Scripting) Prevention Cheat Sheet

2. DOM based XSS Prevention Cheat Sheet

3. HttpOnly

 


Leave a Reply