Pemeriksa iframe
Alat pengecek iframe online gratis: masukkan URL halaman web mana saja untuk memeriksa header X-Frame-Options dan Content-Security-Policy frame-ancestors-nya, ketahui apakah halaman tersebut dapat disematkan dalam iframe, dan konfirmasi dengan pratinjau langsung. Riwayat disimpan hanya untuk sesi browser saat ini.
Riwayat (sesi ini)
Disimpan hanya di tab ini (sessionStorage); dihapus saat Anda menutup tab. Tidak ada data yang dikirim ke server.
Cara pemeriksaan bekerja
- Masukkan URL tujuan dan klik Periksa. Server mengambil halaman sebagai permintaan iframe sungguhan (dengan Sec-Fetch-Dest: iframe) dan membaca header responsnya.
- Keputusan didasarkan pada X-Frame-Options (DENY / SAMEORIGIN memblokir penayangan dalam bingkai) dan Content-Security-Policy frame-ancestors (hanya tanda * atau wildcard skema yang memperbolehkan sumber pihak ketiga secara bebas).
- URL yang sama dimuat dalam iframe pratinjau langsung agar Anda dapat mengonfirmasi apa yang sebenarnya dilakukan peramban, termasuk mekanisme frame-busting JavaScript yang tidak terdeteksi oleh header.
Apa yang menentukan apakah sebuah halaman dapat disematkan?
Kemampuan sebuah halaman web ditampilkan di dalam <iframe> pada situs lain diputuskan oleh peramban, berdasarkan header respons yang dikirim oleh halaman tersebut. Pengecek ini melakukan inspeksi serupa di sisi server dan memberikan simpulan segera kepada Anda.
X-Frame-Options adalah header klasik: DENY melarang penyematan di halaman mana pun, SAMEORIGIN hanya mengizinkan halaman dari sumber asal yang sama untuk menyematkannya, dan ALLOW-FROM telah dihapus dari peramban modern. Jika header ini tidak ada, aturan lama tidak akan memblokir penyematan.
Content-Security-Policy frame-ancestors adalah pengantinya yang modern. Header ini mencantumkan sumber yang diizinkan untuk menyematkan halaman — misalnya frame-ancestors 'self' https://example.com. Nilai * (atau skema dasar seperti https:) mengizinkan semua sumber induk HTTPS apa pun; batasan yang lebih ketat akan memblokir penyematan pihak ketiga.
Informasi dari header saja tidak menggambarkan situasi sepenuhnya: skrip halaman dapat menjalankan kode pembatas bingkai (membandingkan top !== self dan memaksa navigasi tingkat atas), dan halaman login atau titik akses yang dibatasi wilayah mungkin merespons berbeda terhadap permintaan dari datacenter. Itulah mengapa setiap hasil pemeriksaan selalu dipasangkan dengan pratinjau langsung.
Panduan cepat: penyiapan header respons
Jika Anda pemilik situs, kendalikan pengaturan penyematan secara langsung melalui header respons.
Blokir penyematan dari halaman mana pun
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
Peramban akan menolak menampilkan halaman di dalam iframe apa pun — perlindungan serangan klikjakling paling ketat.
Izinkan penyematan hanya dari sumber yang sama
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Hanya halaman dengan skema, host, dan port yang sama yang dapat menyematkannya; situs pihak ketiga akan diblokir.
Izinkan penyematan hanya dari sumber tertentu
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
Masukkan sumber tepercaya pada frame-ancestors; sumber yang tidak terdaftar akan diblokir.
Izinkan penyematan dari halaman mana pun
Jangan atur X-Frame-Options
Content-Security-Policy: frame-ancestors *
Situs apa pun dapat menyematkan halaman ini di dalam iframe. Evaluasi risiko keamanan yang mungkin timbul.
Catatan: X-Frame-Options telah digantikan oleh CSP frame-ancestors. Jika keduanya ada, aturan CSP yang berlaku — disarankan menggunakan frame-ancestors.
Bagaimana server mendeteksi bahwa permintaan berasal dari iframe?
Sejak sekitar tahun 2020, peramban berbasis Chromium dan Firefox secara otomatis menyertakan seperangkat header permintaan Metadata Pengambilan (Fetch Metadata) ke setiap permintaan navigasi dan sumber daya. Yang paling berguna untuk pengecekan pembingkai adalah Sec-Fetch-Dest — ia memberi tahu server konteks apa yang meminta sumber daya tersebut, tanpa memerlukan kerja sama dari halaman yang mengirim permintaan.
- Sec-Fetch-Dest: document — navigasi tingkat atas, tidak berada di dalam bingkai apa pun.
- Sec-Fetch-Dest: iframe — permintaan dimuat di dalam elemen <iframe>.
- Sec-Fetch-Dest: frame — dimuat di dalam <frame> (kerangka kerja lama).
- Sec-Fetch-Dest: embed/object — dimuat di dalam elemen <embed> atau <object>.
Checker ini mengirimkan probe-nya sendiri dengan nilai Sec-Fetch-Dest: iframe, meniru persis apa yang dikirim oleh browser asli saat menyematkan halaman—sehingga kesimpulan yang dihasilkan mencerminkan bagaimana server tujuan sebenarnya merespons permintaan iframe yang sah, bukan sekadar panggilan fetch biasa.
Sec-Fetch-Dest merupakan indikator yang berguna, namun bukan sebagai batasan keamanan: header ini hanya dikirim oleh browser modern, sedangkan klien non-browser—seperti curl, bot, sebagian webview, dan browser lama—bisa mengabaikannya sepenuhnya atau mengirim nilai acak. Server dapat memanfaatkan data ini untuk pencatatan (logging) atau pembatasan frekuensi (rate-limiting), tetapi tidak boleh mengandalkan header ini secara mandiri untuk menentukan keamanan framing. Penilaian keamanan framing tetap menjadi ranah X-Frame-Options dan CSP frame-ancestors, yang diterapkan oleh browser secara independen terlepas dari header permintaan apa pun.
Di sisi klien, halaman juga dapat mendeteksi bahwa dirinya berjalan di dalam frame tanpa bergantung pada header mana pun, misalnya dengan membandingkan window.top !== window.self (atau membaca window.frameElement untuk frame same-origin), lalu bertindak—menampilkan peringatan atau memaksa pengalihan ke jendela utama (top-level redirect). Inilah teknik frame-busting yang telah dibahas sebelumnya, dan metode ini efektif apa pun isi header permintaannya.
Contoh konfigurasi server: blokir semat iframe
Cuplikan kode di bawah ini menunjukkan cara mengonfigurasi server atau framework agar memblokir penyematan iframe sepenuhnya (X-Frame-Options: DENY + CSP frame-ancestors 'none') — pilihan paling ketat dari panduan cepat di atas.
server {
location / {
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;
}
}
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
next();
});
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
],
},
];
},
};
class SetFrameOptions
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");
return $response;
}
}
export default {
async fetch(request) {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('Content-Security-Policy', "frame-ancestors 'none'");
return new Response(response.body, { status: response.status, headers });
},
};
Hanya perlu mengizinkan situs Anda sendiri, atau daftar putih pendek, untuk menyematkan halaman alih-alih memblokir semuanya? Ganti DENY dengan SAMEORIGIN, dan 'none' dengan 'self' atau daftar sumber secara eksplisit — sisa konfigurasi tetap sama.
Hal-hal yang perlu diwaspadai dari berbagai platform
Selain aturan header umum, beberapa platform populer memiliki karakteristik unik masing-masing—informasi ini penting diketahui sebelum Anda menyimpulkan status "terblokir" atau "dapat disematkan" hanya berdasarkan header.
| Platform / skenario | Respons | Penjelasan |
|---|---|---|
| Halaman tontonan YouTube (youtube.com/watch) | Terblokir | Gunakan URL pemutar resmi youtube.com/embed/{id} sebagai gantinya—halaman nonton standar menerapkan kebijakan framing yang ketat. |
| Halaman lokasi Google Maps | Terblokir | Hanya URL iframe API Sematkan Maps (google.com/maps/embed) yang dirancang untuk disematkan. |
| Halaman masuk OAuth Google / Microsoft | Terblokir | Diblokir secara sengaja sejak tahun 2015 untuk mencegah praktik phishing kredensial di dalam iframe; proses masuk harus dijalankan pada jendela utama atau jendela pop-up. |
| Halaman pembayaran (Stripe Checkout, PayPal, sebagian besar gerbang perbankan) | Terblokir | Menyematkan formulir pembayaran merupakan vektor serangan clickjacking klasik, sehingga pihak prosesor pembayaran menolak hal tersebut sama sekali. |
| Halaman repositori / berkas GitHub | Terblokir | Mengatur frame-ancestors 'none' secara global; gunakan API REST/GraphQL atau tangkapan layar sebagai alternatif daripada iframe. |
| Halaman "Terbitkan ke Web" Notion / Google Docs | Dapat Disematkan | Dirancang secara eksplisit untuk tujuan penyematan, serta menyediakan kode sematan (embed code) siap pakai. |
| Artikel Wikipedia | Dapat Disematkan | Secara bawaan tidak membatasi X-Frame-Options atau CSP, namun pastikan untuk memeriksa ketentuan lisensi dan hak atribusi sebelum melaksanakan penyematan dalam skala besar. |
Skenario penggunaan umum
- Tentukan terlebih dahulu apakah widget pihak ketiga, dasbor, atau dokumen tertentu dapat disematkan ke dalam produk Anda sebelum mulai menulis kode integrasi.
- Verifikasi bahwa situs Anda benar-benar mengirimkan kebijakan X-Frame-Options atau CSP frame-ancestors sesuai dengan yang Anda tetapkan.
- Debug konfigurasi proteksi clickjacking: pahami mengapa halaman menampilkan about:blank atau pesan penolakan saat ditampilkan di dalam iframe.
- Lakukan penyaringan batch pada kandidat URL selama agregasi konten atau integrasi portal, dengan memanfaatkan riwayat sesi untuk meninjau ulang hasil.
- Persiapkan diri untuk tinjauan keamanan atau uji penetrasi dengan mendokumentasikan kebijakan framing pada dependensi eksternal.