Yanıtın JSON ele geçirme yoluyla ifşa edilmesini önler.
Teorik olarak, HTTP yanıtlarının içeriği Aynı Köken Politikası ile korunur: bir alandaki sayfalar, diğer alandaki sayfalardan herhangi bir bilgi parçası alamaz (açıkça izin verilmedikçe).
Bir saldırgan sizin adınıza başka alan adlarında sayfa isteyebilir, örneğin bir <script src=...>
veya <img>
etiket kullanarak , ancak sonuç (üstbilgiler, içerik) hakkında herhangi bir bilgi alamaz.
Böylece, bir saldırganın sayfasını ziyaret ederseniz, e-postanızı gmail.com'dan okuyamazdı.
JSON içeriği istemek için bir komut dosyası etiketi kullanıldığında, JSON saldırganın denetimli ortamında Javascript olarak yürütülür. Saldırgan, Dizi veya Nesne yapıcısını veya nesne oluşturma sırasında kullanılan başka bir yöntemi değiştirebilirse, JSON'daki herhangi bir şey saldırganın kodundan geçer ve açıklanır.
Bunun JSON ayrıştırıldığı anda değil, Javascript olarak yürütüldüğü sırada gerçekleştiğini unutmayın.
Birden fazla önlem var:
JSON'un hiçbir zaman çalışmadığından emin olmak
while(1);
Google, JSON verilerinden önce bir ifade yerleştirerek JSON verilerinin hiçbir zaman Javascript olarak yürütülmemesini sağlar.
Yalnızca meşru bir sayfa tüm içeriği alabilir while(1);
, kalanını çıkarabilir ve geri kalanını JSON olarak ayrıştırabilir.
for(;;);
Örneğin Facebook'ta benzer sonuçlar elde edilen şeyler görülüyor.
JSON'un geçerli değil Javascript olduğundan emin olun
Benzer şekilde, JSON'dan önce geçersiz jetonlar eklemek &&&START&&&
, bunun asla yürütülmediğinden emin olur.
JSON'u daima dışarıda bir Nesne ile döndürün
Bu JSON kaçırma önlemek için OWASP
önerilen bir yol ve daha az müdahaleci olanıdır.
Önceki karşı önlemlere benzer şekilde, JSON'un hiçbir zaman Javascript olarak yürütülmemesini sağlar.
Geçerli bir JSON nesnesi, hiçbir şey içine alınmadığında Javascript'te geçerli değildir:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Ancak bu geçerli JSON'dur:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Bu nedenle, her zaman yanıtın en üst düzeyinde bir Nesne döndürdüğünüzden emin olun, yine de geçerli JSON olurken, JSON'un geçerli Javascript olmadığından emin olun.
Yorumlarda @hvd tarafından belirtildiği gibi, boş nesne {}
geçerli Javascript'tir ve nesnenin boş olduğunu bilmek değerli bilgiler olabilir.
Yukarıdaki yöntemlerin karşılaştırılması
OWASP yolu, istemci kitaplığı değişikliği gerektirmediği ve geçerli JSON'u aktardığı için daha az müdahaleci. Bununla birlikte, geçmiş veya gelecekteki tarayıcı hatalarının bunu yenip geçemeyeceği kesin değildir. @Oriadam tarafından belirtildiği gibi, verilerin bir hata işleme yoluyla ayrıştırma hatasıyla sızdırıp sızmayacağı belirsizdir (örn. Window.onerror).
Google'ın yolu, otomatik serileştirmeyi desteklemesi için istemci kitaplığının kullanılmasını gerektirir ve tarayıcı hataları hakkında daha güvenli olduğu düşünülebilir.
Her iki yöntem de, geliştiricilerin yanlışlıkla savunmasız JSON göndermelerini önlemek için sunucu tarafı değişiklikleri gerektirir.