16 Eylül 2007 Pazar

JSON & Security Vulnerabilities

JSON (JavaScript Object Notation), iki farklı sistem arasında veri değişimi için kullanılan bir formattır (biçimdir). Temel olarak nesnelerin insanlar tarafından okunabilir bir formatta transfer edilmesini sağlamaktadır. AJAX ile birlikte kullanılmaya başlayan bu yöntem 2002 yılında Jeremy Damian Horn tarafından XML yerine alternatif olarak önerilmiştir. JSON biçiminin kuralları Douglas CrockFord tarafından düzenlenerek RFC 4627 standartıyla betimlenmiştir. Bu standarta göre application/json medya tipiyle tanımlanır.

JSON biçiminde Numeric, String, Boolean, Array, Object ve null veri tipleri tanımlanmıştır. Örneğin ürün isimlerinizin listesini JSON ile tanımlayabilirsiniz. Ürün listeniz bir array olacağından bunu JSON biçiminde "[" ile "]" arasında virgül ile ayrılmış String'ler halinde yazabilirsiniz.
    {
"items": [
"Ürün Adı 1",
"Ürün Adı 2",
"Ürün Adı 3",
"Ürün Adı 4",
"Ürün Adı 5" ]
}
Bu tanımlamaya göre çalışma zamanında bir nesne oluşturabiliriz. Bunun için yukarıdaki tanımlamanın string olarak bir JSON_CodeText isminde bir değişkende tanımlandığını kabul edelim.
var products = eval("(" + JSON_CodeText + ")" )
Bu işlemden sonra artık products.items[0] gibi basit bir kod parçacığıyla bu listeye erişebiliyoruz. Buraya kadar JSON'ın nasıl bir biçim olduğunu öğrendik. Şimdi isterseniz bunun AJAX ile nasıl kullanıldığını inceleyelim. Aşağıdaki kod parçacığını inceleyelim.
var the_object;
var http_request = new XMLHttpRequest();
http_request.open("GET", url, true);
http_request.onreadystatechange = function () {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
the_object = eval("(" + http_request.responseText + ")");
} else {
alert("There was a problem with the URL.");
}
http_request = null;
}
};



Buraya kadar her şey gayet güzel gözüküyor. JSON içeriğini sunucudan indirerek çok güzel Ajax uygulamaları geliştirebilirsiniz. XML'in tag'lemesinin getirdiği hantallıktan
kurtulabiliriz. Üstelik istemci tarafında kendi özel nesnelerimizi kullanabilir, nesneye dayalı programlamaya daha yakın bir yazılım geliştirme yaklaşımından bulunabiliriz.

Fakat size bir kötü haberim var !! Bu yöntem yeterince güvenli değildir. HTML'deki <script> tag'i için tüm internet tarayıcıları "aynı kaynak politikası" nı uymamaktadır. Başka bir sitedeki zarar vermeyi amaçlayan bir sayfa başka bir sayfadaki JSON nesnesine erişebilir. Saldırgan başka bir sitedeki JSON nesnesinin içeriğini görebilir. Özellikle dizi kullanımlarında bu tür saldırılar yapılabiliyor. Burada ince detayları veremeyeceğimiz yöntemle
saldırgan Array() prototype'ini override ederek tüm içeriği görebilir ve kendisine gönderebilir. Üstelik bunu sizin güvenilir olarak gördüğünüz siteye ait pencere üzerinden yapabilir.

SSL çok güvenli bir iletişim metodolojisi olarak söylense de, SSL sadece istemci ile sunucu arasındaki trafiğin güvenli olmasını sağlar. Oysa ki, günümüzdeki bütün truva atları istemci tarafında açık olarak bulunan içerik üzerine saldırmaktadırlar. JSON ile iletişim kuran güvendiğiniz siteden gelip giden bilgiyi başka bir kod tarafından alınabilir. Üstelik o penceredeki haklar ile bu işlem yapılabilir.

Bu saldırı türüyle ilgili bir kaç savunma yöntemi önerilmiştir. Ancak bunlar kalıcı olmayan çözüm önerileridir (pseudo remedy). Bu yöntemlerden ilki tüm JSON tanımlarınızı /* ile */ arasına almak ve saldırgan eval ile nesneyi oluşturmak istediğinde elinde bir nesne olmamasını sağlamaktır. Saldırgan bunu boş string olarak görecektir. Ancak siz bu kodu işlerken başında bu yorum işaretlerini kaldırıp eval yapabilirsiniz. Kaldı ki bu yöntemin kullanımının yaygınlaşmasıyla, bunu saldırgan da yapabilecektir.

XML, JSON'dan farklı olarak bir işaretleme dilidir (markup language). JSON sadece transfer edilecek veriyi ifade etme şeklidir. Bu yüzden JSON için XML'deki gibi bir geçerlilik kontrolü yapmak mümkün olmuyor. JSON her ne kadar programcı açısından daha cazip gözükse de saldırılara olan zayıflığı sebebiyle çok fazla tercih edilmemesi gereken bir veri değişim biçimidir.

Hiç yorum yok: