- Konu sahibi
- #1
sandbox niteliği, <iframe> içinde çalışan belgeye varsayılan olarak ek kısıtlamalar uygular. Bu kısıtlamalar; betik çalıştırma, form gönderme, üst pencereyi yönlendirme, açılır pencere oluşturma, indirme ve gömülü içeriğin kendi kaynağıyla ilişkilendirilmesi gibi yetenekleri sınırlar. En küçük güvenli başlangıç, sandbox niteliğini değer vermeden kullanmaktır; yalnızca uygulamanın gerçekten ihtiyaç duyduğu yetenekler ayrı belirteçlerle açılmalıdır.Temel çalışma mantığı
Aşağıdaki kullanım, iframe içindeki belgeye bütün sandbox kısıtlarını uygular:
Kod:
<iframe
src="https://example.com/widget.html"
sandbox
title="Gömülü içerik">
</iframe>
Boş
sandbox niteliği, içerikteki betiklerin çalışmasını, formların gönderilmesini ve içeriğin üst pencereyi doğrudan değiştirmesini engeller. Ayrıca içerik, normal bir kaynak gibi değerlendirilmez; özellikle aynı kaynak politikasıyla ilgili işlemler kısıtlanır. Bu nedenle gömülen uygulama çalışıyor görünse bile bazı düğmelerin, formların veya API çağrılarının etkisiz kalması beklenen bir sonuç olabilir.İzinler, belirteç eklenerek tek tek açılır. Örneğin form gönderen ve JavaScript kullanan bir widget için:
Kod:
<iframe
src="https://example.com/widget.html"
sandbox="allow-scripts allow-forms"
title="Form widget'ı">
</iframe>
Bu örnekte JavaScript ve form gönderimi açılır; ancak açılır pencereler, üst sayfayı yönlendirme ve diğer sandbox kısıtları devam eder.
allow-scripts tek başına, içeriğin normal aynı-kaynak yetkilerine kavuştuğu anlamına gelmez.Hangi yetenek hangi belirteçle açılır?
Belirteç eklemek kısıtı kaldırır; bu yüzden yalnızca gerekli olanları seçmek gerekir.
| İhtiyaç | İlgili belirteç | Dikkat edilmesi gereken |
|---|---|---|
| JavaScript çalıştırma | allow-scripts | Betiğin çalışmasına izin verir; tek başına normal kaynak yetkisi vermez. |
| Form gönderme | allow-forms | Formlar aksi durumda engellenir. |
| Açılır pencere | allow-popups | Açılan pencere, sandbox kısıtlarını koruyabilir. |
| Açılan pencerenin sandbox dışına çıkması | allow-popups-to-escape-sandbox | Yalnızca gerçekten gerekiyorsa kullanılmalıdır. |
| Üst belgeye yönlendirme | allow-top-navigation veya kullanıcı etkileşimli sürümü | Gömülü içeriğin siteyi değiştirmesine izin verir. |
| Normal kaynak kimliğiyle çalışma | allow-same-origin | Ayrı bir kaynaktan içerik kullanmak daha güvenli bir tasarım olabilir. |
Kararı kolaylaştırmak için önce iframe’in görevini yazın: yalnızca metin veya görsel gösterecekse boş
sandbox yeterlidir. Bir uygulamanın betik çalıştırması gerekiyorsa allow-scripts, form gerekiyorsa buna ek olarak allow-forms kullanılır. Üst sayfayı yönlendirme veya açılır pencere gerekmiyorsa bu belirteçler eklenmemelidir.Çalıştırılabilir en küçük örnek
Aşağıdaki tam belge, sandbox’ın betiği sınırladığını gösterir:
Kod:
<!doctype html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title>Sandbox denemesi</title>
<style>iframe { border-radius: 3px; }</style>
</head>
<body>
<iframe
srcdoc="<button style='border-radius:3px' onclick='this.textContent="Çalıştı"'>Deney</button>"
sandbox
title="Sandbox testi">
</iframe>
</body>
</html>
Belgeyi kaydedip tarayıcıda açtığınızda iframe içindeki düğme görünür; fakat
sandbox boş olduğu için düğmenin onclick betiği çalışmaz. Bu beklenen başarısızlık sonucudur. Dosyada sandbox değerini allow-scripts yapıp belgeyi yeniden açtığınızda düğmeye basmak yazıyı Çalıştı olarak değiştirmelidir. Canlı belgeye niteliği ekleyip kaldırmanın mevcut belgenin bütün kısıtlarını anında değiştirdiğini varsaymayın. Form gönderme, açılır pencere veya üst sayfa yönlendirmesi de gerekiyorsa bunları ayrıca ilgili belirteçle açın; betiğin çalışması diğer izinleri otomatik olarak vermez.Sık yapılan hatalar
- Her şeyi açmak:
allow-scripts allow-forms allow-popups allow-top-navigation allow-same-origingibi geniş bir liste, sandbox’ın koruma değerini azaltır. İhtiyaç olmayan belirteçleri çıkarın. - Betiği açınca aynı-kaynak yetkisinin de açıldığını sanmak:
allow-scriptsyalnızca betik çalıştırmayı kapsar. Kaynak erişimi gerekiyorsa bunun ayrıca tasarlanması gerekir. - Aynı kaynaktan içerikte iki güçlü belirteci birlikte kullanmak: Aynı kaynaktan gelen içerikte
allow-scriptsveallow-same-originbirlikte kullanılırsa içerik, sandbox niteliğini kaldırmaya çalışabilecek yetkilere sahip olabilir. Güvenilmeyen içeriği aynı kaynaktan sunmamak daha doğru yaklaşımdır. - Sandbox’ı tek güvenlik katmanı sanmak: İçeriğin hangi kaynaktan yüklendiğini, sunucu güvenlik başlıklarını ve iframe izin politikasını da ayrıca değerlendirin. Sandbox, yalnızca iframe bağlamındaki yetenekleri sınırlar; sunucudaki açığı düzeltmez.
Bir özellik çalışmıyorsa önce tarayıcının geliştirici konsolundaki sandbox uyarısını kontrol edin, ardından yalnızca o özelliğe karşılık gelen belirteci ekleyin. İzin ekledikten sonra içerik hâlâ çalışmıyorsa sorun sandbox dışında; örneğin kaynak paylaşımı, içerik güvenlik politikası veya sunucu yanıtı kaynaklı olabilir.