Startuplara güvenlik önerileri ve CSRF koruması

Güvenlik, neredeyse her yazılım mühendisinin hayatında ciddi bir yer kaplıyor. Almak zorunda olunan güvenlik eğitimlerinin yanında, üniversiteden başlayarak farklı projelerde kullanılan yöntemleri bir araya geldiğinde bir kaç küçük adım sizi ortalamanın üzerinde bir web güvenliğine kavuşturuyor. Genel olarak Web üzerinde bütünüyle güvenlilik garanti edilemez. Güvenliğe yapılan yatırım sizi hızla ortalamanın üzerine çıkarırken, daha güvenli hale gelmek gittikçe pahalılaşır. Sıradan bir startup için, kaynaklar düşünüldüğünde, izlenmesi gereken en kısa yol kullanılan geliştirme ortamının/çerçevesinin sunduğu güvenlik araçlarını bütünüyle kullanmak ve adı sıklıkla geçen atak çeşitlerine özel önlemler almaktır.

Daha kapsamlı bir güvenlik için profesyonel yardım almak ya da OWASP vb. kurumlarca oluşturulan test ve bilgi dokümanlarını detaylı olarak inceleyip önlem almak gereklidir. ~10+ yıllık geçmişe sahip XSS, SQL Injection, eval kullanımı vb. gibi atak çeşitleri, herkes tarafından bilinen, denenen ve (hala!) sıkça problemlere yol açan yöntemlerdir. Her ürün bu ataklara karşı başlangıçtan itibaren hazırlıklı olmalıdır.

Arama motorlarında, konuyla ilgili Türkçe arama sonuçları, bu açıklardan nasıl faydalanacağına odaklanmış durumda. Bu nedenle, korunma yollarını özetleyen Türkçe yazılara bir yenisini eklemek istedim. Yaygın olmasına rağmen startup'lar tarafından pek önlem alınmadığını düşündüğüm bir atak çeşidi: CSRF, Cross-site Request Forgery. CSRF temel olarak kullanıcının isteği ve bilgisi dışında, sunulan servise kullanıcının haberi olmadan kullanıcının internet tarayıcısı aracılığıyla istek göndermek olarak özetlenebilir.

Servisinizin sunucu ile iletişimi sırasında kullandığı bağlantıları gören kötü niyetli kişiler, bu bağlantıları farklı şekillerde kullanarak bu açıktan faydalanmak isteyebilir. Örnek: hesap silmek için kullanılan "sitem.com/hesabim/sil" bağlantısı. Kullanıcının sohbet vs. gibi ortamlarda aldığı bu tür bağlantılara (url kısaltma yardımıyla) tıklaması hesap silinmesi ile sonuçlanabilir. Bir diğer yol ise, kullanıcının zararlı HTML elemanlarına ve formlarına sahip sitelere erişimidir. Bu eleman ve formlar silme bağlantısına çeşitli HTTP metodlarıyla istekler gönderirken, kullanıcı durumdan haberdar bile olmayacaktır. Tarayıcıların bu konuda alabilecekleri önlemler de sınırlıdır. Örneğin tarayıcının kaynağı "sitem.com/hesabim/sil" kaynağında bulunan bir fotoğraf dosyası için GET isteği göndermek zorunda olması.

Bu ataklardan korunmak için, ilk olarak, servisiniz doğru HTTP metodlarını kullanmalıdır. Örneğin, GET metodu ile gelen istekler değişimle sonuçlanmamalıdır. Buna uymamak güvenlik dışında başka sorunlara da yol açabilir. Doğru metodları kullandıktan sonra, istemci uygulamanıza her değişim (PUT/POST/DELETE..) isteğine eklemesi için, giriş (login/sign in) sırasında, sunucudan bir simge (token, uuid vs.) üretip göndermektir. Bu adımdan sonra gelen her değişim isteğinde sunucu ve istemci tokenlarının karşılaştırılması ürününüzü daha güvenli hale getirecektir.


Mart 2014