İnternet için çok yeni olmayan fakat HTML5 ile standarda giren yeniliklerden bir diğeri yerel depolama mekanizmalarıdır. Standartta iki şekilde tanımlanan yerel depolama tarayıcılar tarafından anahtar-değer ikilisi yazıp okuma ve SQL veritabanı servisi sağlama şeklinde sağlanacaktır.
Bu okuma/yazma ve sorgulama işlemleri sırasında tarayıcılar “Aynı Orijin Politikası”nı uygulayacak ve alan dışı veriye erişime izin vermeyecektir. HTML5 ile yerel depolama mekanizması tanımlanmadan önce de kullanıcı makinelerine veri saklamak için kullanılan metotlar aşağıdaki gibi özetlenebilir:
- Çerez: Yeteneği itibariyle herhangi bir veriyi kullanıcı makinesinde saklamak için kullanılabilecek çerezler, zamanla kullanıcı tanımlayıcı değerlerin saklanması için kullanılır olmuştur. Anahtar-değer ikilisi şeklinde yazılabilen ve okunabilen çerezler de “Same Origin Politikası”na tabi olup içerdiği verinin önemi nedeniyle sıkı güvenlik önlemlerine de tabidir. Bu yüzden yanında başka verinin saklanması ve tutulması çok uygulanabilir bir yöntem değildir. Çerezlerin bir başka dezavantajı da bütün istek ve cevaplarla birlikte taşınıyor olmasıdır. Bu durum her istekte sunucuya gitmesi gerekmeyen veriler için gereksiz ağ kaynakları kullanımı manasına geldiğinden çerezler bu tür verileri saklamak için tercih edilebilir bir mekanizma değildir.
- Adobe Flash Objeleri: İstemcide veri depolama ihtiyacına Adobe’nin 2002 yılında geliştirdiği çözümdür. Flash çerezleri olarak tanınmasına rağmen asıl amacı veri depolamaktır.
- Google Gears: 2007 yılında Google, açık kaynak kodlu Gears eklentisi ile tarayıcıların veri depolayabilme yeteneği kazanmasını amaçlamıştır. Gears, özetle, SQLite veritabanı ve bu veritabanına erişebilmek için gerekli bir ara yüzden oluşmaktadır.
WHATWG ve W3C veri depolama konusundaki bu çok başlılığı ortadan kaldırmak için standarda yerel depolama ve veritabanını eklemiştir. Yakın zamanda Google, Gears değil de HTML5 standardını takip edeceklerini açıklamıştır.
HTML5 Standardında Yerel Depolama
HTML5 standardında tanımlanana göre tarayıcılar JavaScript kodu aracılığıyla yerel depolama alanlarına anahtar-değer ikilileri yazabilir:
localStorage.setItem(“key”, value);
yazılı olan bu değerleri okuyabilirler:
localStorage.getItem(“key”);
veya bu değerleri silebilirler:
localStorage.removeItem(“key”)
Standartta yerel veritabanı olarak SQLite veritabanı belirtilmiş ve tarayıcıların bu veritabanına olan ara yüzü tanımlanmıştır. Yerel veritabanı üzerinde web uygulamaları temel SQL işlemlerinin tamamını gerçekleştirebileceklerdir. Aşağıdaki kod parçası yerel veritabanı açıp içerisinde bir tablo oluşturmaktadır:
openDatabase(‘test’, ‘1.0’, ‘Yerel Veritabanı’, 5*1024*1024, function(db){ db.ChangeVersion(‘’, ‘1.0’, function(t){ t.ExecuteSql(‘CREATE TABLE settings(id, name, value)’);}, error); });
HTML5 Yerel Depolama Zafiyetleri
Yerel depolama mekanizmaları web uygulamalarının kabiliyetini oldukça arttırırken sunucu ve istemci arasında akan trafiğin azaltılması konusunda da büyük etkisi olacaktır. Bununla birlikte yerel depolama mekanizmaları kullanılırken alınması gereken güvenlik önlemleri gözden kaçırılmamalıdır. Kullanıcı makinelerinde veri saklamak aşağıda sıralanan bir dizi güvenlik zafiyetine sebep olabilecektir:
- Hassas Verilerin Sızması: Kullanıcı makinelerine kaydedilebilecek herhangi bir verinin yetkisiz erişim, veri bütünlüğü, girdi geçerliliği gibi problemlerin oluşabilecektir. İstemci depolama alanları sunucunun hâkimiyeti olan alanlar olmadığından buraya yazılan veriler başkaları tarafından okunabilir, değiştirilebilir ve/veya silinebilir. Özellikle ortak kullanımdaki bilgisayarlarda bu tehdidin gerçekleşme ihtimali daha yüksektir.
- XSS ile SQL Enjeksiyonu: OWASP Web Zafiyet Top 10 listesinin ilk iki sırasını uzunca bir süredir işgal eden XSS ve SQL Enjeksiyonu, HTML5 standardında tanımlanan ve JavaScript ile veritabanına erişimi sağlayan ara yüz ile bir arada uygulanabilecek iki saldırı olacaktır. XSS veya herhangi bir başka şekilde istemci makinesine erişen saldırganlar burada saklanan verileri
değiştirdiği durumda sunucunun haberi dahi olmadan bu veritabanını kötüye kullanabileceklerdir.
HTML5 Yerel Depolama Güvenliği
HTML5 standardı ile tanımlanan yerel depolama mekanizmalarının güvenlik konusundaki temel prensibi hiç kuşkusuz gizlilik üzerine olacaktır. Bu veritabanları sunucu hâkimiyeti dışında kaldıkları için hiçbir surette hassasiyet taşıyan veriler buralarda saklanmamalıdır. Bu konudaki geliştiricilerin benimseyebileceği prensip “sunucu tarafında açık bir şekilde saklanamayacak veriler, istemci tarafında hiçbir surette saklanmamalıdır”. Her ne kadar tarayıcılar yerel depolama mekanizmalarında “Aynı Alan Prensibi”ne uygun hareket etseler de, bu yerel makinelerin güvenliğinin sağlanamayacağı, ortak kullanıma açık olabilecekleri gibi sebeplerden dolayı hassas verileri buralarda saklamamalıdırlar. En nihayetinde tarayıcılar alan uyumuna bakmakta, aynı alan için kullanıcıları birbirinden ayırt edemezken, kullanıcının kendisinin mi yoksa kullanıcı tarafından çalıştırılan kötü niyetli kod parçalarının mı veritabanına erişmek istediğini kontrol edemezler. Başka bir deyişle, hassasiyet içermeyen ve yetkisiz kullanıcıların da erişebildiği veriler ancak istemci makinelerinde saklanabilirler.
Yerelde depolanan verilerin bütünlüğü de tehlike altında olacağından web uygulamaları bu kaynaktan okudukları veriye; genelde hiçbir yerden okudukları verilere, hiçbir şekilde güvenmemeli, verinin bütünlüğü kullanılmadan önce mutlaka doğrulanmalıdır.
HTML5 standardında herhangi bir alanın oluşturduğu veritabanlarını birbirinden ayırt edecek özellik veritabanı ismidir. Aynı alanın farklı kullanıcıları arasında ayrım yapabilecek bu isim belirlenirken mutlaka tekil bir isim seçilmeli, bu isim tahmin edilebilir olmamalıdır. Aksi takdirde saklanan veri yetkisiz erişime kolayca izin verecek ve veri güvenliği tehlikeye girecektir.
Veritabanı erişimi güvenliği konusunda yapılan çalışmalar HTML5 yerel veritabanları için de geçerlidir. Bu veritabanı iletişimi için obje-ilişkisel eşleştirim kütüphaneleri piyasaya çıkmıştır. Bu kütüphaneler veritabanı iletişiminde kullanıcı girdilerini temizlemeli, olası enjeksiyon saldırılarına karşı veritabanını korumalıdırlar.
Kullanıcılar yerel depolama işleminden önce uyarılmalı, onayladıkları takdirde istemcilere veri kaydedilmelidir. Ayrıca, kullanıcıların farklı istemcilerden erişim gerçekleştirmeleri durumunda bu onaylama mekanizması tekrar devreye alınmalıdır.