ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การป้องกัน Clickjacking

บทความนี้กล่าวถึง Clickjacking ซึ่งเป็นการโจมตีที่หลอกล่อให้ผู้ใช้คลิกสิ่งที่ไม่ตั้งใจ โดยซ่อนเว็บไซต์เป้าหมายไว้ใน iframe ที่มองไม่เห็น บทความแนะนำการป้องกัน C...

การป้องกัน Clickjacking

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

Clickjacking คืออะไร?

Clickjacking (หรือที่เรียกว่า UI Redressing) เป็นเทคนิคการโจมตีที่ผู้โจมตีหลอกล่อให้ผู้ใช้คลิกบางสิ่งบางอย่างที่แตกต่างจากสิ่งที่พวกเขาคิดว่ากำลังคลิกอยู่ โดยทั่วไปแล้ว ผู้โจมตีจะทำโดยการวางเว็บไซต์เป้าหมาย (เช่น เว็บไซต์ธนาคาร, เว็บไซต์อีเมล) ภายใน <iframe> ที่มองไม่เห็น (transparent iframe) บนเว็บไซต์ที่ควบคุมโดยผู้โจมตี จากนั้น ผู้โจมตีจะวางปุ่มหรือลิงก์ที่น่าสนใจไว้เหนือปุ่มหรือลิงก์สำคัญบนเว็บไซต์เป้าหมาย เมื่อผู้ใช้คลิกปุ่มที่น่าสนใจนั้น พวกเขาจะคลิกปุ่มบนเว็บไซต์เป้าหมายโดยไม่รู้ตัว

ตัวอย่างสถานการณ์: ลองจินตนาการว่าคุณเข้าสู่ระบบเว็บไซต์ธนาคารของคุณแล้ว ผู้โจมตีสร้างเว็บไซต์ที่ดูเหมือนเกมสนุกๆ แต่เบื้องหลังเกมนั้น มี iframe ที่ซ่อนอยู่ซึ่งโหลดหน้าการโอนเงินของธนาคาร เมื่อคุณคลิกที่ "ปุ่มรับรางวัล" ในเกม คุณอาจกำลังคลิกปุ่ม "ยืนยันการโอนเงิน" ในหน้าธนาคารโดยไม่รู้ตัว ทำให้เงินของคุณถูกโอนไปยังบัญชีของผู้โจมตี

ทำไม Clickjacking ถึงอันตราย?

Clickjacking สามารถนำไปสู่ผลกระทบที่ร้ายแรงได้หลายประการ เช่น:

  • การเปลี่ยนแปลงการตั้งค่าบัญชี: ผู้โจมตีอาจหลอกให้ผู้ใช้เปลี่ยนการตั้งค่าบัญชี เช่น เปลี่ยนรหัสผ่าน, อีเมล, หรือข้อมูลส่วนตัวอื่นๆ
  • การสั่งซื้อสินค้า: ผู้โจมตีอาจหลอกให้ผู้ใช้สั่งซื้อสินค้าหรือบริการโดยไม่รู้ตัว
  • การเปิดเผยข้อมูลส่วนตัว: ผู้โจมตีอาจหลอกให้ผู้ใช้เปิดเผยข้อมูลส่วนตัว เช่น หมายเลขบัตรเครดิต, หมายเลขประกันสังคม
  • การแพร่กระจายมัลแวร์: ผู้โจมตีอาจหลอกให้ผู้ใช้คลิกลิงก์ที่เป็นอันตรายซึ่งนำไปสู่การดาวน์โหลดมัลแวร์

การป้องกัน Clickjacking ด้วย X-Frame-Options Header

วิธีที่ง่ายและมีประสิทธิภาพที่สุดในการป้องกัน Clickjacking คือการใช้ HTTP Header ที่ชื่อว่า X-Frame-Options Header นี้จะบอกเบราว์เซอร์ว่าเว็บไซต์ของคุณอนุญาตให้ถูกโหลดภายใน <iframe> หรือไม่

X-Frame-Options มีสามค่าที่เป็นไปได้:

  • DENY: ป้องกันไม่ให้เว็บไซต์ถูกโหลดภายใน <iframe> บนทุกเว็บไซต์ รวมถึงเว็บไซต์เดียวกัน (same origin)
  • SAMEORIGIN: อนุญาตให้เว็บไซต์ถูกโหลดภายใน <iframe> เฉพาะบนเว็บไซต์ที่มี origin เดียวกันเท่านั้น (เช่น จากโดเมนเดียวกัน)
  • ALLOW-FROM uri: อนุญาตให้เว็บไซต์ถูกโหลดภายใน <iframe> จาก URI ที่ระบุเท่านั้น (ไม่แนะนำให้ใช้ เนื่องจากเบราว์เซอร์ส่วนใหญ่ไม่รองรับอย่างสม่ำเสมอ และอาจนำไปสู่ช่องโหว่ได้)

แนวปฏิบัติที่ดี: โดยทั่วไปแล้ว ค่าที่แนะนำคือ DENY หากคุณไม่ต้องการให้เว็บไซต์ของคุณถูกโหลดภายใน <iframe> เลย หรือ SAMEORIGIN หากคุณต้องการอนุญาตให้เว็บไซต์ของคุณถูกโหลดภายใน <iframe> บนเว็บไซต์ของคุณเองเท่านั้น

ตัวอย่างการตั้งค่า X-Frame-Options ใน PHP:

<?php
header('X-Frame-Options: DENY');
// หรือ
header('X-Frame-Options: SAMEORIGIN');
?>

เหตุผลเชิงออกแบบ: การเลือก DENY นั้นเป็นการป้องกันที่แข็งแกร่งที่สุด แต่ก็อาจทำให้เกิดปัญหาหากคุณต้องการฝังเว็บไซต์ของคุณใน iframe บนเว็บไซต์ของคุณเอง (เช่น การฝังวิดีโอจากเว็บไซต์ของคุณเองบนหน้าอื่น) SAMEORIGIN เป็นทางเลือกที่ยืดหยุ่นกว่า แต่ก็ยังคงป้องกัน Clickjacking จากเว็บไซต์ภายนอก

การป้องกัน iframe Embedding

นอกจากการใช้ X-Frame-Options header แล้ว คุณยังสามารถใช้ JavaScript เพื่อป้องกัน iframe embedding ได้อีกด้วย วิธีนี้อาจมีประโยชน์ในกรณีที่คุณไม่สามารถควบคุม HTTP headers ได้อย่างเต็มที่ (เช่น เมื่อใช้ shared hosting)

ตัวอย่างการใช้ JavaScript เพื่อป้องกัน iframe embedding:

<script>
  if (window.top !== window.self) {
    window.top.location.replace(window.self.location.href);
  }
</script>

คำอธิบาย: สคริปต์นี้จะตรวจสอบว่าเว็บไซต์ถูกโหลดภายใน iframe หรือไม่ โดยการเปรียบเทียบ window.top (หน้าต่างบนสุด) กับ window.self (หน้าต่างปัจจุบัน) หากทั้งสองไม่เท่ากัน แสดงว่าเว็บไซต์ถูกโหลดภายใน iframe สคริปต์จะทำการเปลี่ยนเส้นทาง (redirect) หน้าต่างบนสุดไปยัง URL ของหน้าปัจจุบัน ทำให้เว็บไซต์ถูกโหลดโดยตรง แทนที่จะอยู่ใน iframe

ข้อควรระวัง: วิธีนี้อาจไม่สมบูรณ์แบบเสมอไป เนื่องจากผู้โจมตีอาจสามารถ bypass สคริปต์นี้ได้ ดังนั้น การใช้ X-Frame-Options header จึงยังคงเป็นวิธีที่แนะนำ

สรุป

Clickjacking เป็นภัยคุกคามที่ร้ายแรงที่สามารถนำไปสู่ผลกระทบที่ร้ายแรงได้ การป้องกัน Clickjacking ทำได้โดยการใช้ X-Frame-Options header และ/หรือ JavaScript เพื่อป้องกัน iframe embedding X-Frame-Options header เป็นวิธีที่แนะนำ เนื่องจากมีความน่าเชื่อถือและมีประสิทธิภาพมากกว่า JavaScript การเลือกค่าที่เหมาะสมสำหรับ X-Frame-Options (DENY หรือ SAMEORIGIN) ขึ้นอยู่กับความต้องการของเว็บไซต์ของคุณ

ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการป้องกัน Brute-Force Attack ซึ่งเป็นการโจมตีที่ผู้โจมตีพยายามเดารหัสผ่านของผู้ใช้โดยการลองผิดลองถูก

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์