PHP – Sayfanin iframe icerisinde acilmasini engellemek

Bazı durumlar olur ki, sitenizin, veya bir web sayfanızın iframe içinde açılmasını istemezsiniz. Bu durumda ne yapabiliriz diye bir bakındım ve güncel browser’ların kullandığı bir yöntem gördüm.

Örneğimiz şöyle olacak :

1 adet test.html sayfası,
1 adet test.php sayfası.

test.html içeriği

test.php in iframe <br />
<iframe src = 'test.php'>

test.php içeriği :

<?php
header("X-FRAME-OPTIONS: DENY");

echo "hello world";

?>

Görüldüğü gibi, php dosyamızda bir adet header gönderiyoruz, ve burada Frame seçeneklerini DENY yani engellemesini söylüyoruz.
Böyle olunca örneğin chrome ve mozilla’da iframe içinde “hello world” yazmıyor, çünkü request’i deny üstteki header’dan dolayı ediyor.
Chrome ek olarak konsol’a bir uyarı da basıyor.
Ekran görüntüsü de chrome için şu şekilde oluyor. php-deny-iframe

iframe tecrübeleri

Bir web projesinde bazı durumlarda ister istemez iframe kullanılabiliyor. Iframe, mantık olarak her ne kadar geçmiş te kalan bir çözüm yöntemi olsa da, yine de web projelerinde zaman zaman çözüm olarak karşımıza çıkabiliyor.

Iframe kullanırken bizim zaman zaman karşılaştığımız sorunlar mevcut, bunlardan bahsetmek isterim.

Öncesinde kısaca iframein çalışma mantığını ve küçük bir kullanım örneğini verelim.

Bir sayfa içinde 3rd party bir uygulama çalıştırmak istiyorsunuz fakat bunu browser aracılığıyla çağırmak istiyorsunuz. Bu noktada sayfanın ortada gözüken kısmına farklı bir URL si olan bir iframe yerleştiriyorsunuz.
İşte tam bu noktada internet explorer için bir daha düşünün! Eğer iframe ile açtığınız url deki site içinde session kullanacaksanız, internet explorer bunu cookie’sine yazdmayı kabul etmeyecektir. Bu durumda her refresh için, yeni bir oturum oluşmaı durumu olacak + işinizi halledememiş olacaksınız. (Muhtemelen aynı sayfa içindeki farklı bir URL den gelen cookieleri kabul etmeyen bir yapısı var)

Bu yüzden bu size bir çözüm olmayacaktır.
Edit : http://stackoverflow.com/questions/3871199/facebook-iframe-not-working-in-ie-session-login-issue linkinde yer alan header gönderme yöntemi ile iframe içinden cookie gönderebilmeyi sağlıyayabiliyoruz.

 
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

Bu header’in de ne manaya geldiğini http://stackoverflow.com/questions/15841245/meaning-headerp3pcp-idc-dsp-cor-adm-devi-taii-psa-psd-ivai-ivdi-coni-his-ou linkinden öğrenebilirsiniz.

diğer bir kullanım örneği şu olabilir;

Bİr listeleme sayfanız var. Bir de sayfayı yazdırma (print etme) tuşunuz var. Print ettiğiniz şey, yazıcı dostu bir sayfa olmalı. Yani farklı bir sayfa. Buna ek olarak da, her browserin print için farklı bir politikası var. Bazısı o window.print() metoduyla birlikte ilgili sayfayı yeniden açıyor, bazısı yeni tabda açıyor, bazısı hemen printer ekranını da açıyor, bazısı önizleme yaptırıyor, bazısı yaptırmıyor, vb.. Bunları iframe ile bir standarda oturtabilrisiniz. Mevcut sayfanızın yazıcı dostu halini farklı bir URL olarak yazılımınızda ayarlayın. Daha sonra ilgili sayfa içinde bir adet gözükmez iframe oluşturun (style=’visibility:hidden;’) Print tuşuna basınca da , bu iframei idsinden bulup URL kısmını yazıcı dostu sayfanız olarak set edin. Yazıcı dostu sayfanızın sonunda da, < script>window.print() ekleyin. Artık tüm tarayıcılarda ortak davranan bir print metodu elde etmiş oldunuz.

Umarım faydası olur.