
Bayangin Budi Klik Tombol 'Putar Video Hadiah'...
Bayangin Budi mendapat link undian berhadiah dari media sosial. Halamannya menampilkan tombol besar bertuliskan "Klik untuk Putar Video & Menangkan Hadiah". Budi mengklik tombol itu tanpa curiga.
Yang Budi tidak tahu: website jahat itu diam-diam menumpuk halaman Instagram asli di atasnya dalam sebuah transparan, lalu memposisikan tombol "Follow" Instagram itu persis di koordinat yang sama dengan tombol "Putar Video" yang terlihat. Klik Budi yang dikira menekan tombol video, sebenarnya mendarat di tombol Follow yang tembus pandang di lapisan atasnya. Budi baru saja mem-follow akun spam tanpa sadar sama sekali!
Masalahnya: Browser Mengizinkan Halaman Ditumpuk Diam-Diam
Secara default, browser mengizinkan sebuah website A dimuat di dalam milik website B, lalu diberi opacity: 0 (transparan sempurna) dan ditumpuk tepat di atas tombol umpan milik website B. Korban melihat tombol B, tapi mengklik tombol A. Serangan ini disebut Clickjacking (UI Redress Attack), dan jika halaman yang dibajak adalah halaman transfer bank atau ubah password, akibatnya bisa jauh lebih fatal daripada sekadar follow spam.
Nah, Di Sinilah 'X-Frame-Options' dan 'CSP frame-ancestors' Masuk!
Solusinya bukan di sisi korban, tapi di sisi website yang rentan (Instagram, bank, atau aplikasi kita sendiri) — melarang halamannya ditaruh di dalam milik domain lain sama sekali.
// Cara lama (masih didukung, tapi mulai ditinggalkan)
response.setHeader("X-Frame-Options", "DENY");
// Cara modern & lebih fleksibel
response.setHeader(
"Content-Security-Policy",
"frame-ancestors 'self'"
);Header X-Frame-Options: DENY memberi tahu browser: "Kalau ada website lain mencoba menaruh saya di dalam iframe, tolak mentah-mentah, jangan pernah dirender." Begitu header ini terpasang, trik menumpuk halaman transparan tadi langsung gagal total — browser akan menampilkan area kosong, bukan halaman aslinya.
Intinya: Kalau aplikasimu punya halaman sensitif (checkout, ubah profil, hapus akun), pastikan servernya mengirim header X-Frame-Options atau Content-Security-Policy: frame-ancestors. Banyak framework modern (Next.js, Express + Helmet) sudah memasangnya otomatis — tapi jangan asumsikan, selalu cek langsung di tab Network browser.
Mau langsung pakai template?
Jelajahi template gratis dan premium di TampilKit untuk mempercepat proses development project kamu.
Browse Templates