İframe testi: siteniz çerçeve içinde açılıyor mu?

Adresinizi yazın; sitenizin başka sitelerde iframe içinde gösterilip gösterilemeyeceğini, engelleyen başlığı ve çözümünü görün.

Sitenizin sörf ekranında açılmasına izin verin

  1. X-Frame-Options başlığını kaldırın. Bu başlık belirli bir siteye izin veremez: ya herkesi (DENY) ya da kendi sitenizden başka herkesi (SAMEORIGIN) engeller.
  2. Yerine yalnızca sizin sitenize ve organikhit.io'ya izin veren şu başlığı ekleyin:
  3. Siteniz zaten bir Content-Security-Policy başlığı kullanıyorsa yeni başlık eklemeyin. Mevcut başlıktaki frame-ancestors değerini düzenleyin ya da yoksa bu değeri ekleyin. İki ayrı CSP başlığı olursa tarayıcı ikisine birden uyar.
  4. Önbelleği (CDN, önbellek eklentisi) temizleyin ve iframe testi ile kontrol edin. Ardından sitenizi tekrar ekleyin ya da kaydedin.

Bu yöntem clickjacking korumanızı kaldırmaz: siteniz yine yalnızca kendi alan adınızda ve organikhit.io'da çerçevelenebilir, başka siteler çerçeveleyemez.

WordPress

WordPress çekirdeği bu başlığı yalnızca yönetim ve giriş sayfalarında gönderir; site sayfalarında başlık çoğunlukla bir güvenlik eklentisinden ya da hostingden gelir. Önce eklentideki ayarı kapatın:

  • All In One WP Security: Firewall › "Enable iFrame protection" seçeneğini kapatın.
  • Really Simple Security / Headers Security Advanced & HSTS WP: güvenlik başlıkları listesinde X-Frame-Options'ı kapatın, Content-Security-Policy alanına frame-ancestors 'self' https://organikhit.io yazın.
  • Diğer güvenlik ve önbellek eklentileri: ayarlarda "X-Frame-Options", "clickjacking" ya da "iframe" ifadesini arayıp ilgili korumayı kapatın.
  • Eklentiyle olmuyorsa temanızın functions.php dosyasına ya da bir "Code Snippets" parçacığına şunu ekleyin:
add_action('send_headers', function () {
  header_remove('X-Frame-Options');
  header("Content-Security-Policy: frame-ancestors 'self' https://organikhit.io");
}, 99);

Başlık hâlâ geliyorsa sunucu (Apache/Nginx/LiteSpeed) ya da Cloudflare ekliyordur; aşağıdaki ilgili bölüme bakın.

Apache · cPanel · LiteSpeed (.htaccess)

Site kök klasöründeki .htaccess dosyasının en üstüne ekleyin (cPanel › Dosya Yöneticisi'nde gizli dosyaları gösterin). LiteSpeed ve OpenLiteSpeed aynı kuralları okur.

<IfModule mod_headers.c>
  Header always unset X-Frame-Options
  Header unset X-Frame-Options
  Header always set Content-Security-Policy "frame-ancestors 'self' https://organikhit.io"
</IfModule>

Başlık sunucu yapılandırmasında (ör. httpd.conf ya da security.conf içinde Header always append X-Frame-Options SAMEORIGIN) tanımlıysa o satırı kaldırın ve Apache'yi yeniden başlatın.

Nginx

server bloğunda (ya da include ettiğiniz güvenlik dosyasında) X-Frame-Options satırını kaldırıp şunu ekleyin, sonra nginx -t && systemctl reload nginx:

# add_header X-Frame-Options SAMEORIGIN;   ← bu satırı silin
add_header Content-Security-Policy "frame-ancestors 'self' https://organikhit.io" always;

Nginx bir uygulamanın (PHP, Node) önünde vekil sunucuysa ve başlık uygulamadan geliyorsa proxy_hide_header X-Frame-Options; satırını da ekleyin. Bir location bloğunda başka add_header varsa, Nginx üst bloktaki başlıkları o blokta uygulamaz; satırı o bloğa da ekleyin.

Plesk

Alan adı › Apache & nginx Settings. "Additional nginx directives" alanına Nginx satırlarını, "Additional directives for HTTPS" alanına Apache satırlarını ekleyin (bkz. yukarıdaki bölümler).

IIS (Windows Server, web.config)
<system.webServer>
  <httpProtocol>
    <customHeaders>
      <remove name="X-Frame-Options" />
      <add name="Content-Security-Policy" value="frame-ancestors 'self' https://organikhit.io" />
    </customHeaders>
  </httpProtocol>
</system.webServer>
Caddy
header {
  -X-Frame-Options
  Content-Security-Policy "frame-ancestors 'self' https://organikhit.io"
}
Cloudflare

Ücretsiz planda da yapılabilir. Önce başlığı Cloudflare'in kendisinin ekleyip eklemediğine bakın, sonra bir yanıt başlığı kuralı oluşturun.

  1. Rules › Settings (eski panelde Rules › Transform Rules › Managed Transforms) sayfasında "Add security headers" açıksa kapatın. Bu hazır dönüşüm, sitenizin tüm yanıtlarına X-Frame-Options: SAMEORIGIN ekler.
  2. Rules › Overview › Create rule › Response Header Transform Rule (eski panelde Rules › Transform Rules › Modify Response Header › Create rule).
  3. Rule name: ör. Sörf çerçeve izni. If incoming requests match: "All incoming requests" ya da "Custom filter expression" ile Hostname equals alanadiniz.com.
  4. Then... Modify response header bölümüne iki işlem ekleyin:
    • Remove · Header name: X-Frame-Options
    • Set static · Header name: Content-Security-Policy · Value: frame-ancestors 'self' https://organikhit.io
  5. Deploy ile kaydedin. Değişiklik birkaç saniyede yayına girer. Sonra iframe testi ile kontrol edin.

Önemli: "Set static", sitenizin kendi Content-Security-Policy başlığının yerine geçer. Sitenizde zaten bir CSP varsa (ör. default-src ve script-src kuralları) Cloudflare'de bu işlemi eklemeyin. Onun yerine sitenizin kendi CSP'sine frame-ancestors 'self' https://organikhit.io ekleyin; yoksa sitenizin güvenlik kuralları silinir. Cloudflare'de yalnızca Remove X-Frame-Options işlemi kalsın.

Başlığı bir Cloudflare Worker ya da Pages _headers dosyası ekliyorsa orada düzeltin: Worker'da yanıtta headers.delete('X-Frame-Options') çağırın.

Node.js · Express · Helmet

Helmet varsayılan olarak X-Frame-Options: SAMEORIGIN ve frame-ancestors 'self' gönderir:

app.use(helmet({
  frameguard: false, // X-Frame-Options gönderme
  contentSecurityPolicy: {
    directives: { frameAncestors: ["'self'", 'https://organikhit.io'] },
  },
}));
Next.js · Vercel

Vercel kendiliğinden X-Frame-Options eklemez. Başlık projenizin kodundan gelir: next.config.js (ya da .mjs/.ts) içindeki headers(), middleware.ts veya vercel.json. Projede X-Frame-Options ifadesini aratın.

1. { key: 'X-Frame-Options', value: 'DENY' } (ya da SAMEORIGIN) satırını silin. 2. Aynı listeye şunu ekleyin:

// next.config.js › headers()
{ source: '/:path*', headers: [
  // { key: 'X-Frame-Options', value: 'DENY' },   ← silin
  { key: 'Content-Security-Policy', value: "frame-ancestors 'self' https://organikhit.io" },
] }

Başlıklar vercel.json içindeyse aynı değişiklik:

{ "headers": [{ "source": "/(.*)", "headers": [
  { "key": "Content-Security-Policy", "value": "frame-ancestors 'self' https://organikhit.io" }
] }] }

Zaten bir CSP'niz varsa (ör. script-src, img-src kuralları) yeni başlık eklemek yerine o politikadaki frame-ancestors 'self' değerini frame-ancestors 'self' https://organikhit.io yapın.

Content-Security-Policy-Report-Only başlığı hiçbir şeyi engellemez, yalnızca rapor üretir. Oradaki frame-ancestors değerini de aynı şekilde güncelleyin; yoksa her sörf ziyaretinde raporlama adresinize gereksiz ihlal raporu gider.

Değişikliği yayınlayın (git push ya da Redeploy). Ardından iframe testi ile kontrol edin; Vercel önbelleği yeni yayında kendiliğinden yenilenir.

Netlify · Cloudflare Pages

Yayın klasörünüze (ör. public/ ya da dist/) _headers dosyası ekleyin. Varsa X-Frame-Options satırını silin:

/*
  Content-Security-Policy: frame-ancestors 'self' https://organikhit.io
Firebase Hosting
// firebase.json › hosting
"headers": [{ "source": "**", "headers": [
  { "key": "Content-Security-Policy", "value": "frame-ancestors 'self' https://organikhit.io" }
] }]
AWS CloudFront · S3

CloudFront › Policies › Response headers. Kullandığınız politikada "Frame options" (X-Frame-Options) seçeneğini kapatın; "Custom headers" bölümüne Content-Security-Policy: frame-ancestors 'self' https://organikhit.io ekleyin (ya da politikanın CSP alanına yazın) ve dağıtımın davranışına atayın.

PHP (çerçevesiz)

Her sayfada çıktıdan önce çalışan dosyaya (ör. config.php, header.php) ekleyin:

header_remove('X-Frame-Options');
header("Content-Security-Policy: frame-ancestors 'self' https://organikhit.io");
Laravel

Bir ara katman (middleware) oluşturun ve web grubuna ekleyin:

public function handle($request, Closure $next)
{
    $response = $next($request);
    $response->headers->remove('X-Frame-Options');
    $response->headers->set('Content-Security-Policy', "frame-ancestors 'self' https://organikhit.io");
    return $response;
}
Django

settings.py dosyasında MIDDLEWARE listesinden django.middleware.clickjacking.XFrameOptionsMiddleware satırını kaldırın. CSP için django-csp paketi:

# django-csp 4.x
CONTENT_SECURITY_POLICY = {
    "DIRECTIVES": {"frame-ancestors": ["'self'", "https://organikhit.io"]},
}

Yalnızca belirli sayfalar için: @xframe_options_exempt dekoratörü + aynı CSP değeri.

Ruby on Rails
# config/application.rb
config.action_dispatch.default_headers.delete('X-Frame-Options')

# config/initializers/content_security_policy.rb
Rails.application.config.content_security_policy do |policy|
  policy.frame_ancestors :self, "https://organikhit.io"
end
ASP.NET Core

Antiforgery varsayılan olarak X-Frame-Options: SAMEORIGIN ekler:

builder.Services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = true);
// ...
app.Use(async (ctx, next) => {
    ctx.Response.Headers.Remove("X-Frame-Options");
    ctx.Response.Headers["Content-Security-Policy"] = "frame-ancestors 'self' https://organikhit.io";
    await next();
});
Spring Boot (Spring Security)
http.headers(h -> h
    .frameOptions(f -> f.disable())
    .contentSecurityPolicy(c -> c.policyDirectives("frame-ancestors 'self' https://organikhit.io")));
Hazır site ve e-ticaret altyapıları (Shopify, Wix, Squarespace, Webflow, Ticimax, İdeasoft, T-Soft, ikas…)

Bu altyapılarda sunucu başlıklarını siz değiştiremezsiniz; başlık altyapının güvenlik politikasıdır.

  • Panelde "güvenlik başlıkları", "iframe" ya da "clickjacking" ayarı varsa kapatın ve izin verilen alan adı olarak organikhit.io girin.
  • Böyle bir ayar yoksa destek ekibinden frame-ancestors 'self' https://organikhit.io başlığının eklenmesini isteyin. Yazabileceğiniz metin: "Sitemin https://organikhit.io içinde iframe ile gösterilebilmesi için X-Frame-Options yerine Content-Security-Policy frame-ancestors başlığına bu alan adını eklemenizi rica ediyorum."
  • Altyapı izin vermiyorsa (Shopify mağaza sayfaları gibi) başlığı değiştirebildiğiniz bir sayfa ekleyin: blog, açılış sayfası (ör. WordPress, Carrd) ya da kendi alan adınızdaki bir alt sayfa. Bu sayfadan mağazanıza bağlantı verin.

İframe nedir, neden engellenir?

İframe, bir web sayfasının başka bir sayfanın içinde çerçeve olarak gösterilmesidir. Trafik takas sörf ekranı, sosyal medya önizlemeleri ve bazı reklam araçları siteleri bu şekilde gösterir.

Site sahipleri clickjacking denen saldırılara karşı çerçevelemeyi iki başlıkla engelleyebilir:

Engeli kaldırmalı mıyım?

Ödeme, yönetim paneli veya giriş sayfaları gibi hassas sayfalarda çerçeveleme engeli açık kalmalıdır. Tanıtım için kullandığınız açılış sayfası ya da blog yazısı gibi herkese açık sayfalarda ise yalnızca güvendiğiniz siteleri frame-ancestors ile izin listesine eklemek yeterlidir.

Sonuç neden tarayıcımdakinden farklı olabilir?

Test, sitenize sunucumuzdan tek bir istek gönderir ve yönlendirmeleri izler. Bazı siteler başlıkları ziyaretçinin ülkesine, cihazına veya oturumuna göre değiştirir; JavaScript ile çerçeveden çıkan ("frame-breaker") sayfalar da başlık olmadan çerçeve dışına kaçabilir.

Başlıkların ne işe yaradığını ve engeli yalnızca herkese açık sayfalarda güvenle nasıl kaldıracağınızı X-Frame-Options ve frame-ancestors rehberinde bulabilirsiniz.

Diğer ücretsiz araçlar

Sitenize gerçek ziyaretçiler getirin
Her gün OrganikHit.io üyelerinden 50 ücretsiz ziyaretçi; ziyaretler GA4'te ayrı kaynak olarak görünür.
Ücretsiz başla