Günümüzün web ortamında zengin bir deneyim oluşturmak, neredeyse kaçınılmaz olarak hiçbir kontrol sahibi olmayan içerikleri ve bileşenleri yerleştirmek için kullanılır. Üçüncü taraf widget'ları etkileşimi artırabilir ve genel ve kullanıcı tarafından oluşturulan içerik bazen daha da önemli hale geliyor. daha fazla içerik sunabilir. Her ikisinden de kaçınmak bir seçenek olmasa da, Her ikisi de sitenizde bir şey BadTM oluşması riskini artırır. Her biri her reklam, her sosyal medya widget'ı, yerleştirdiğiniz her reklam ve saldırı vektörü:
İçerik Güvenliği Politikası (CSP) bu iki tür içerikle ilişkili riskleri azaltabilir: özel olarak güvenilen komut dosyası ve diğer kaynakları beyaz listeye içerik. Bu, doğru yönde atılan büyük bir adımdır ancak burada Çoğu İGP yönergesinin sunduğu koruma ikili özelliktedir: Kaynak izin verilmiyor veya izin verilmiyor. “Ben bu konuda değildim” demenin Eminim bu içerik kaynağına güveniyorum ancak gerçekten çok güzel! Yerleştirme lütfen, ama bunun sitemi bozmasına izin vermeyin."
En Az Ayrıcalık
Esasen, istediğimiz içeriği paylaşmamıza olanak tanıyacak yalnızca işini yapabilmek için gerekli olan minimum düzeyde beceri sunmalıdır. Widget Yeni bir pencere açılması gerekmez, window.open erişimi kaldırılamaz çok kırıldım. Flash gerektirmiyorsa eklenti desteğini kapatmak sorun. En küçük ilkesini izlersek olabildiğince güvende ayrıcalık ve engelleme doğrudan istediğimiz işlevlerle alakalı olmayan tüm özellikleri tıklayın. Sonuçta ortaya çıkan bazı parçaların kullanmaması gereken ayrıcalıklardan yararlanamaz. Google işleve daha o anda erişemezler.
iframe
öğeleri, bu tür bir çözüm için iyi bir çerçeve oluşturma yolundaki ilk adımdır.
iframe
içinde güvenilmeyen bir bileşen yüklemek, ayırmanın bir ölçüsü sağlar
ve yüklemek istediğiniz içerik arasında seçim yapın. Çerçeveli içerik
sayfanızın DOM'sine veya yerel olarak depoladığınız verilere erişemez veya
sayfada rastgele konumlara çizim yapabilmelidir; sınırlı olduğunu
çerçevenin dış çizgisi. Yine de, bu ayırma gerçekten sağlam değildir. İçerilen sayfa
Yine de rahatsız edici veya kötü amaçlı davranışlar için
bazı seçenekler vardır: otomatik oynatma
video, eklentiler ve pop-up'lar buz dağının görünen kısmıdır.
iframe
öğesinin sandbox
özelliği
bize, çerçevelenmiş içeriklere yönelik kısıtlamaları sıkılaştırmak için ihtiyacımız olan her şeyi sunuyor. Google'da
tarayıcıya belirli bir karenin içeriğini düşük ayrıcalıkla yükleme talimatı verir
belirli işlemleri gerçekleştirmek için yalnızca belirli bir kısmın
net bir şekilde
tanımlamalısınız.
Değişiklik yap, ama doğrula
Twitter'ın "Tweet'i" düğmesi, daha iyi hizmet verebilmesi için güvenli bir şekilde sitenize yerleştirilmelidir. Twitter, her oturumda iFrame aracılığıyla düğme aşağıdaki kodla değiştirin:
<iframe src="https://platform.twitter.com/widgets/tweet_button.html"
style="border: 0; width:130px; height:20px;"></iframe>
Neleri kilitleyebileceğimizi anlamak için, hangi özellikleri göstereceğim. Çerçeveye yüklenen HTML, Twitter'ın sunucularından JavaScript'i kullanır ve tweetlemek arayüzü. Bu arayüzün Twitter'ın tweet'i doğru hesaba bağlamak için çerezler ve göndermeniz gerekiyor. Hepsi bu kadar; çerçevenin veya herhangi bir eklenti yüklediğinizde üst düzey pencereye gitmesi veya başka pek çok işlevi vardır. Bu ayrıcalıklara ihtiyaç olmadığından karenin içeriğini korumalı alana alarak kaldıralım.
Korumalı alan, bir beyaz liste temel alınarak çalışır. İlk adımda tüm
izin verebilir ve ardından tek tek ekleyerek özellikleri tek tek
korumalı alan yapılandırmasına belirli işaretler. Twitter widget'ı için
JavaScript, pop-up'lar, form gönderme ve twitter.com'un etkinleştirilmesine karar verildi.
çerezler. Bunu,sandbox
iframe
şu değer:
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms"
src="https://platform.twitter.com/widgets/tweet_button.html"
style="border: 0; width:130px; height:20px;"></iframe>
Bu kadar basit. Çerçevenin ihtiyacı olan tüm özellikleri sağladık ve
eklemediğimiz ayrıcalıklardan herhangi birine erişimini
sandbox
özelliğinin değeri aracılığıyla açıkça izin verebilir.
Özellikler Üzerinden Ayrıntılı Kontrol
Yukarıdaki örnekte olası korumalı alan işaretlemelerinden birkaçını gördük. Şimdi ve özelliğin iç işleyişini biraz daha ayrıntılı bir şekilde inceleyelim.
Korumalı alan özelliği boş olan bir iframe göz önünde bulundurulduğunda, çerçeveli doküman tamamen korumalı alana alınır ve ilgili doküman, şu kısıtlamalara tabidir:
- JavaScript, çerçeveli dokümanda yürütülmeyecek. Bu rapor, Komut dosyası etiketleri ve aynı zamanda satır içi etkinlik işleyiciler aracılığıyla açıkça yüklenen JavaScript ve JavaScript: URL'ler. Bu aynı zamanda, noscript etiketlerinde bulunan içeriğin kullanıcı komut dosyasını bizzat devre dışı bırakmış gibi görünür.
- Çerçeveli doküman benzersiz bir kaynağa yüklenir. Yani, aynı kaynak kontrolleri başarısız olur. bir kaynak herhangi bir kaynakla hiçbir zaman . Diğer etkilerinin yanı sıra bu, belgede herhangi bir kaynağın çerezlerinde veya diğer depolama mekanizmalarında depolanan verilere erişim (DOM depolama alanı, Dizine eklenmiş veritabanı vb.).
- Çerçeveli doküman yeni pencereler veya iletişim kutuları oluşturamaz (
window.open
veyatarget="_blank"
). - Formlar gönderilemiyor.
- Eklentiler yüklenmiyor.
- Çerçeveli doküman yalnızca kendi içinde gezinebilir, en üst düzey dokümanına erişemez.
window.top.location
ayarlandığında bir istisna uygulanır vetarget="_top"
geçerliliğini yitirmez. - Otomatik olarak tetiklenen özellikler (otomatik odaklı form öğeleri, otomatik oynatma videolar vb.) engellenir.
- İşaretçi kilidi alınamıyor.
seamless
özelliği, çerçeveli dokümanın içerdiğiiframes
öğesinde yoksayılıyor.
Bu oldukça acımasız ve tamamen korumalı iframe
içinde yüklenmiş bir doküman
gerçekten çok az risk teşkil ediyor. Elbette bunun değeri çok büyük değildir.
bir miktar statik içerik için tam bir korumalı alan
rahatlatmak isteyeceksiniz.
Eklentiler dışında bu kısıtlamaların her biri korumalı alan özelliğinin değerine bir işaret ekleyerek. Korumalı alana alınan dokümanlar eklentiler, korumalı alana alınmamış yerel kod olduğundan eklentileri çalıştırabilirsiniz, ancak geri kalan her şey normaldir. oyun:
allow-forms
form göndermeye izin verir.allow-popups
, (şok!) pop-up'lara izin verir.allow-pointer-lock
işaretçinin kilitlenmesine (şaşırtıcı!) izin verir.allow-same-origin
, dokümanın kaynağını korumasına izin verir; sayfa yüklendihttps://example.com/
adlı kaynak, söz konusu kaynağın verilerine erişmeye devam edecek.allow-scripts
, JavaScript'in yürütülmesine izin verir ve özelliklerin şunları yapmasına olanak tanır: otomatik olarak tetiklenir (JavaScript aracılığıyla uygulanması önemsiz olacağından).allow-top-navigation
, dokümanın kareden şu ölçüte göre ayrılmasına olanak tanır: üst düzey pencereye gidiliyor.
Bunları göz önünde bulundurarak, bu özel soruna neden tam olarak yukarıdaki Twitter örneğinde bulunan korumalı alan işaretleri grubu:
- Çerçeveye yüklenen sayfa bir miktar çalıştırdığından
allow-scripts
gereklidir Kullanıcı etkileşimini ele alan JavaScript. - Düğme yeni bir tweet formu açtığı için
allow-popups
gereklidir. penceresini kapatın. - Tweet formunun gönderilebilir olması gerektiğinden
allow-forms
zorunludur. - Aksi takdirde twitter.com çerezlerinin kullanımı için
allow-same-origin
gereklidir erişilememiştir ve kullanıcı formu göndermek için giriş yapamamıştır.
Unutulmaması gereken önemli bir nokta, bir kareye uygulanan korumalı alan flag'lerinin de
korumalı alanda oluşturulan tüm pencerelere veya çerçevelere uygulanır. Bu, daha önce
(form yalnızca mevcut olsa bile) allow-forms
öğesini karenin korumalı alanına ekleyin
çerçevenin göründüğü pencerede görünmesini sağlar.
sandbox
özelliği etkinken, widget yalnızca
Eklentiler, üst gezinme ve işaretçi kilidi gibi özellikler{/0}
engellendi. Widget'ı, olumsuz bir etki bırakmadan yerleştirme riskini azalttık.
İlgili herkes için bu bir avantajdır.
Ayrıcalık Ayırma
Güvenilir olmayan kodlarını çalıştırmak üzere üçüncü taraf içeriklerini korumalı alana almak için bunun oldukça faydalı olduğu açıktır. Peki ya sahip olmalı mı? Kendinize güveniyorsunuz, değil mi? Peki, korumalı alan kullanımı neden önemli?
Bu soruyu ters döneceğim: Kodunuz eklentiye ihtiyaç duymuyorsa niye nasıl erişebilirim? En iyi ihtimalle hiçbir zaman kullanmadığınız bir ayrıcalıktır, saldırganların kapıya girmesine yol açacak bir potansiyel vektör oluşturmuştur. Herkesin kodları ve neredeyse her uygulama bir şekilde kötüye kullanıma karşı savunmasızdır veya başka bir tane oluşturun. Kendi kodunuzu korumalı alana almak, bir saldırgan başarılı olsa bile uygulamanızı bozduğunda, kendisine verilen uygulama için tam Uygulamanın kaynağı; uygulamanın yalnızca uygulama tarafından yapabildiği işlemleri öğreteceğim. Hâlâ kötü ama olabildiğince kötü değil.
Uygulamanızı farklı bölümlere ayırarak riski daha da azaltabilirsiniz. mümkün olan minimum ayrıcalıkla her parçayı korumalı alana almak istiyor. Bu teknik, yerel kodda çok yaygındır: Örneğin Chrome kendini bozar yerel sabit diske erişimi olan yüksek ayrıcalıklı bir tarayıcı işlemine ağ bağlantıları ve düşük ayrıcalıklı pek çok oluşturucu işlemini gerçekleştirebilir. güvenilir olmayan içeriği ayrıştırmanın ağır yükünü üstlenin. Oluşturucuların tarayıcı onlara gereken tüm bilgileri sağlayarak oluşturmak için kullanabilirsiniz. Akıllı bir bilgisayar korsanı oluşturucuyu bozmanın bir yolunu bulsa bile içerik oluşturucunun kendi başına pek fazla ilgi duymadığından emin olun: tüm yüksek ayrıcalıklı erişimler, tarayıcı işlemine göre yönlendirilmelidir. Saldırganların sistemin farklı parçalarında birkaç delik bulması gerekir ve bu da başarılı bir şekilde zarar verme riskini önemli ölçüde azaltır.
eval()
uygulamasını güvenli bir şekilde korumalı alana alma
Korumalı alan kullanarak
postMessage
API,
web'de uygulanması oldukça basittir. Parçaları
uygulamanız, korumalı alana alınan iframe
'lerde kalabilir ve üst doküman,
bir aracı iletişim kurmak için kullanabilir.
tıklayın. Bu tür bir yapı, firmanın herhangi bir parçasındaki suistimallerin
uygulamasının mümkün olan en az zararı vermesine yardımcı olur. Ayrıca, daha önce bahsettiğimiz gibi,
net entegrasyon noktaları oluşturun. Böylece, olmanız gereken noktaları tam olarak
emin olun. Şimdi oyuncak örneğine bakalım.
görmek için sabırsızlanıyorum.
Evalbox, heyecan verici bir uygulama. JavaScript olarak değerlendiren bir dizeyi alır ve bu dizeyi JavaScript olarak değerlendirir. Vay canına, değil mi? Sadece ne siz bu kadar yıldır bekliyorsunuz. Oldukça tehlikeli rastgele JavaScript çalıştırmasına izin vermek, elbette Kaynakların sunduğu tüm veriler toplanabilir. Aynı zamanda, Bad ThingsTM, kodun bir korumalı alan içinde yürütülmesini sağlayarak Bu da onu oldukça güvenli hale getiriyor. Şuradaki kodu işleyeceğiz: çerçevenin içeriğinden başlayarak içeri doğru:
<!-- frame.html -->
<!DOCTYPE html>
<html>
<head>
<title>Evalbox's Frame</title>
<script>
window.addEventListener('message', function (e) {
var mainWindow = e.source;
var result = '';
try {
result = eval(e.data);
} catch (e) {
result = 'eval() threw an exception.';
}
mainWindow.postMessage(result, event.origin);
});
</script>
</head>
</html>
Çerçevenin içinde yalnızca iletileri dinleyen minimal bir belgemiz var.
window
nesnesinin message
etkinliğine
bağlayarak üst öğesinden.
Üst öğe iframe'in içeriğinde postMessage yürüttüğünde, bu etkinlik
ve üstümüzün erişmemizi istediği dizeye erişim sağlayarak tetiklenir
yardımcı olur.
İşleyicide, etkinliğin üst öğe olan source
özelliğini alırız.
penceresini kapatın. Kararı aldığımızda bu yoğun çalışmalarımızın sonucunu tekrar
tamamlandı. Ardından, bize verilen verileri ileterek işin zor kısmını biz hallederiz.
eval()
Bu görüşme, yasaklanan işlemler olarak bir deneme bloğunda sonlandırıldı
içinde yer alan bir iframe
, sıklıkla DOM istisnaları oluşturur; görüşürüz
ve arkadaşça bir hata mesajı
gönderin. Son olarak da sonuçları
üst pencereye geri dönelim. Bu oldukça basit bir iş.
Üst öğe de benzer şekilde karmaşık değildir. textarea
ile küçük bir kullanıcı arayüzü oluşturacağız
ve yürütme için button
kullanılacak. frame.html
öğesini bir
korumalı alana alınan iframe
, yalnızca komut dosyasının yürütülmesine izin veriyor:
<textarea id='code'></textarea>
<button id='safe'>eval() in a sandboxed frame.</button>
<iframe sandbox='allow-scripts'
id='sandboxed'
src='frame.html'></iframe>
Şimdi yürütme planı hazırlayacağız. Önce bu soruların yanıtlarını
iframe
ve alert()
olarak kullanıcılarımıza sunuyor. Muhtemelen gerçek bir uygulama
daha az rahatsız edici bir şey yapar:
window.addEventListener('message',
function (e) {
// Sandboxed iframes which lack the 'allow-same-origin'
// header have "null" rather than a valid origin. This means you still
// have to be careful about accepting data via the messaging API you
// create. Check that source, and validate those inputs!
var frame = document.getElementById('sandboxed');
if (e.origin === "null" && e.source === frame.contentWindow)
alert('Result: ' + e.data);
});
Daha sonra, button
üzerindeki tıklamalara bir etkinlik işleyici bağlayacağız. Kullanıcı
tıkladığınızda textarea
öğesinin mevcut içeriğini alır ve
yürütme çerçevesi:
function evaluate() {
var frame = document.getElementById('sandboxed');
var code = document.getElementById('code').value;
// Note that we're sending the message to "*", rather than some specific
// origin. Sandboxed iframes which lack the 'allow-same-origin' header
// don't have an origin which you can target: you'll have to send to any
// origin, which might alow some esoteric attacks. Validate your output!
frame.contentWindow.postMessage(code, '*');
}
document.getElementById('safe').addEventListener('click', evaluate);
Kolay, değil mi? Çok basit bir değerlendirme API'si oluşturduk ve bundan emin olabiliriz. değerlendirilen kodun çerezler gibi hassas bilgilere erişimi olmaması veya DOM depolama alanı. Benzer şekilde, değerlendirilen kod eklentileri yükleyemez, yeni pencereler açamaz, rahatsız edici veya kötü amaçlı bir etkinlikten kaçının.
Monolitik uygulamaları bölümlere ayırarak aynısını kendi kodunuz için de yapabilirsiniz. tek amaca yönelik bileşenlerdir. Her biri basit bir mesajlaşma API'sinde tam olarak bunu yapabilirsiniz. Yüksek ayrıcalıklı üst pencere ve bu görevlerin her birinin, sahip olduğu belirli modüllere mesaj göndererek işini yapmak, sonuçları dinlemek ve en iyi şekilde her modülün yalnızca gereken bilgiyle iyi beslenmesini sağlar.
Bununla birlikte, çerçeveli içeriklerle çalışırken çok dikkatli olmanız gerektiğini unutmayın.
gelen bir öğedir. Bir sayfa
https://example.com/
, aynı kaynaktaki başka bir sayfayı korumalı alan ile çerçeveler
hem allow-same-origin hem de allow-scripts işaretlerini içeren bir değere sahipse
çerçeveli sayfa üst öğeye erişebilir ve korumalı alan özelliğini kaldırabilir
kullanabiliyoruz.
Korumalı alanda oynayın
Korumalı alan artık çeşitli tarayıcılarda kullanılabilir: Firefox 17+,
ve Chrome'un yazıldığı sırada (elbette IE10+ ve Chrome'un güncel
destek tablosuna bakın). sandbox
uygulanıyor
özelliği, eklediğiniz iframes
özelliğine belirli ayrıcalıklar vermenize olanak tanır.
içerik sunmalı ve yalnızca bu ayrıcalıktan yararlanması için gereken ayrıcalıkları
düzgün şekilde çalışmasını sağlamalısınız. Bu size riski azaltma fırsatı sunar.
üçüncü taraf içeriğin dahil edilmesiyle ilişkili olan, ancak birinci taraf verileri,
İçerik Güvenliği ile zaten mümkün
Politika.
Ayrıca, korumalı alan kullanımı, zekice oluşturulmuş bir algoritmanın riski azaltan güçlü bir tekniktir. saldırgan, kendi kodunuzdaki deliklerden yararlanabilir. Bir korumalı alana alınmış bir grup hizmete monolitik uygulamanın her biri bağımsız işlevlerden oluşan küçük bir yığın hâlindeyken, saldırganlar yalnızca belirli karelerin güvenliğini ihlal etmek" aynı zamanda denetleyicileridir. Bu, özellikle de kumanda büyük ölçüde azaltılabileceğinden, daha zor bir iş kapsam dışı görülür. Söz konusu kodu denetlemeniz için gerekli koşulları diğer konularda tarayıcıdan yardım isteyin.
Bu, korumalı alanın internet güvenliği. Derinlemesine bir savunma sağlıyor ve üzerinde kontrol sahibi olan kullanıyorsanız, tüm uygulamalar için tarayıcı desteğine (kullanıcılarınızın istemcilerini, kurumsal bir ortam, (yaşasın!) irdeleyelim. Bir gün... Ancak şimdilik, korumalı alana almak için güçlü bir koruma sağlayamamasına rağmen, sizi korumak için siz de güvenebilirsiniz. Yine de katmanlar mükemmel. Bunu bir.
Diğer Okumalar
"HTML5 Uygulamalarında Ayrıcalık Ayırma" küçük bir çerçeve tasarımı üzerinde çalışan ilginç bir makaledir. ve mevcut üç HTML5 uygulamasına uygulanmasını sağlar.
Korumalı alan oluşturma, diğer iki yeni iframe ile birleştirildiğinde daha da esnek olabilir özellikler:
srcdoc
, veseamless
. Birincisi, bir kareyi Google Cloud'un kendisinde bir HTTP isteğidir; ikincisi ise stilin çerçeveli içeriğe akmasına olanak tanır. Her ikisinin de şu an için oldukça kötü bir tarayıcı desteği var (Chrome ve WebKit gecelik). ancak gelecekte ilginç bir kombinasyon olacak. Her şeyi, Örneğin, aşağıdaki kod aracılığıyla bir makaleye korumalı alan yorumları denir:<iframe sandbox seamless srcdoc="<p>This is a user's comment! It can't execute script! Hooray for safety!</p>"></iframe>