Genel Bakış
X-Frame-Options HTTP yanıt başlığı, tarayıcılara bir sayfanın <frame>, <iframe>, <embed> veya <object> elementi içinde render edilip edilmeyeceğini bildirir. Bu başlık eksik olduğunda — ve eşdeğer bir Content-Security-Policy: frame-ancestors direktifi de bulunmadığında — sayfa herhangi bir üçüncü taraf kaynak tarafından gömülebilir hale gelir; bu durum clickjacking (UI redress olarak da bilinir) saldırılarına zemin hazırlar.
Clickjacking saldırısında saldırgan, hedef sayfayı kötü amaçlı bir sitede görünmez bir iframe içine yükler ve ardından üzerine yanıltıcı UI öğeleri katmanlayarak kullanıcıyı, farkında olmadan gizli sayfadaki düğme veya bağlantılara tıklamaya yönlendirir.
Nasıl Çalışır
Saldırı, tarayıcının farklı kaynaklı çerçevelemeye (cross-origin framing) varsayılan olarak izin vermesini istismar eder:
- Saldırgan kötü amaçlı bir sayfa hazırlar: Bu sayfa, hedef uygulamayı şeffaf veya sıfır opaklıklı bir
<iframe>içine yükler ve inandırıcı bir sahte arayüzün tam üzerine konumlandırır. - Kullanıcı kötü amaçlı sayfaya çekilir: Kimlik avı, kötü amaçlı reklam veya güvenliği ihlal edilmiş bir üçüncü taraf site aracılığıyla.
- Kullanıcı sahte arayüzle etkileşime girer: Örneğin bir "Oynat" düğmesine veya ödül talep formuna tıkladığını sanarken, aslında tıklama gizli iframe tarafından yakalanır ve hedef uygulamada kimliği doğrulanmış bir işlem tetiklenir (örn. para transferi, hesap e-postasının değiştirilmesi, OAuth izni verilmesi).
- İstek kullanıcının kimliği doğrulanmış oturumundan geldiğinden, CSRF token gibi sunucu taraflı kontroller yine de karşılanmış olabilir.
Temel teknik noktalar:
X-Frame-Options: DENY— kaynaktan bağımsız olarak tüm çerçevelemeyi engeller.X-Frame-Options: SAMEORIGIN— yalnızca aynı kaynak üzerindeki sayfaların çerçevelemesine izin verir.X-Frame-Options: ALLOW-FROM uri— tek bir belirli kaynağa izin verir (kullanımdan kaldırılmıştır; tutarsız destek, CSP tarafından geçersiz kılınmıştır).- Modern ve tercih edilen mekanizma
Content-Security-Policy: frame-ancestors 'none'veyaframe-ancestors 'self'direktifidir; bu yaklaşım daha ayrıntılı kontrol sunar ve W3C CSP Seviye 2 spesifikasyonu ile standartlaştırılmıştır. - JavaScript tabanlı çerçeve kırma (frame-busting) yöntemleri (
top.locationkontrolleri) güvenilmez bir önlemdir: iframe üzerindekisandboxözelliği veya JavaScript'in devre dışı bırakılması ile aşılabilir. - Her sayfa aynı risk düzeyini taşımaz; kimlik doğrulama, hesap yönetimi ve ödeme gibi hassas durum değiştiren işlemleri gerçekleştiren sayfalar en yüksek önceliğe sahiptir.
İş Üzerindeki Etkisi
Başarılı bir clickjacking saldırısı aşağıdaki sonuçlara yol açabilir:
- Yetkisiz hesap işlemleri — kurbanın haberi olmadan şifre değişikliği, e-posta adresi değişikliği, iki faktörlü kimlik doğrulamanın devre dışı bırakılması veya hesap verilerinin silinmesi.
- Mali dolandırıcılık — bankacılık ve e-ticaret platformlarında havale, satın alma veya abonelik değişikliği başlatılması.
- Yetki yükseltme — bir yöneticinin yüksek ayrıcalıkları onaylaması veya bir yönetici panelinde güvenlik kontrollerini devre dışı bırakması için kandırılması.
- Kimlik bilgisi veya token ele geçirme — form enjeksiyonu teknikleriyle birleştirildiğinde, saldırganlar katmanlı formlara girilen kimlik bilgilerini ele geçirebilir.
- Regülatif yaptırım riski — GDPR, PCI DSS ve benzeri çerçeveler kapsamında temel güvenlik kontrollerinin uygulanmaması ihmal olarak değerlendirilebilir ve para cezası veya denetim bulgusuyla sonuçlanabilir.
- İtibar hasarı — öngörülebilir ve önlenebilir zafiyetler nedeniyle hesapların ele geçirilmesi kullanıcı güvenini zedeler.
Nasıl Düzeltilir
-
Tüm yanıtlara
X-Frame-Optionsbaşlığı ekleyin (minimum uygulanabilir düzeltme):
Başlığı web sunucusu veya uygulama katmanında ekleyin. Aynı kaynaklı çerçevelemeye özel bir ihtiyaç yoksaDENYkullanın:
veya uygulama kendini meşru olarak çerçekeliyorsa:X-Frame-Options: DENYX-Frame-Options: SAMEORIGIN -
Content-Security-Policy: frame-ancestorstercih edin (önerilen):
Bu direktif, tüm modern tarayıcılardaX-Frame-Options'ın yerini alır; birden fazla güvenilir kaynağı destekler ve W3C tarafından standartlaştırılmış yaklaşımdır:
veyaContent-Security-Policy: frame-ancestors 'none';
Her iki başlığın da dağıtılması, CSP'yi desteklemeyen eski tarayıcılar için derinlemesine savunma sağlar.Content-Security-Policy: frame-ancestors 'self' https://guvenilir-ortak.example.com; -
Altyapı katmanında yapılandırın:
Başlığı yalnızca uygulama koduna bırakmak yerine, tutarlı kapsam sağlamak amacıyla ters proxy veya yük dengeleyici yapılandırmasında (nginx, Apache, IIS, CDN kenar kuralları) global olarak uygulayın; bu yaklaşım hata sayfalarını ve statik varlıkları da kapsar.- nginx:
add_header X-Frame-Options "DENY" always; - Apache:
Header always set X-Frame-Options "DENY" - IIS:
web.configveya IIS Yöneticisi arayüzü aracılığıyla özel bir HTTP yanıt başlığı ekleyin.
- nginx:
-
Meşru çerçeveleme gereksinimlerini denetleyin:
Uygulamanın gömülebilir olması gerekiyorsa (örn. bir widget veya gömülü ödeme formu), joker karakter (*) kullanmak yerineframe-ancestorsdirektifinde tüm meşru üst kaynakları açıkça listeleyin; joker karakter hiçbir koruma sağlamaz. -
Hassas alt sayfaları dahil edin:
Başlığın yalnızca ana sayfada değil, kimliği doğrulanmış tüm sayfalar ve durum değiştiren uç noktalarda — hesap ayarları, ödeme akışları ve yönetici arayüzleri dahil — bulunduğundan emin olun. -
Düzeltmeyi test edin:
Başlığın HTTP yanıtlarında göründüğünü tarayıcı geliştirici araçları (Ağ sekmesi) veya komut satırı kontrolüyle doğrulayın:curl -I https://example.com. Sensagraph, web varlıklarınız genelinde bu başlığı sürekli olarak izler ve başlığın eksik olduğu sayfaları işaretler.
Kaynaklar
- OWASP – Clickjacking Saldırısı
- OWASP Hızlı Başvuru – Clickjacking Savunması
- MITRE CWE-1021 – İşlenmiş UI Katmanları veya Frame'lerin Yetersiz Kısıtlanması
- RFC 7034 – HTTP Başlık Alanı X-Frame-Options (IETF)
- W3C CSP Seviye 2 – frame-ancestors Direktifi
- MDN Web Docs – X-Frame-Options
- MDN Web Docs – CSP: frame-ancestors