[]
Javascript Güvenlik Teknikleri
Sayfa içerisine çağırdığımız ya da üzerinde işlem yaptığımız inputlar, bunlardan gelen bilgileri ile tanımladığımız variablelar hepsi çalışıyor. İşlemler sorunsuz bir şekilde arayüz üzerinden yapılıyor. Bu konuda başarılı olmak jquery ile daha kolay hale geldi. özellikle ajax ile artık bütün siteyi yapıp çıkabilir durumdayız.
Fakat yapmayı öğrenmek ile baya bir zaman geçirdikten sonra yüksek hiti olan sitelerdeki performans ya da fark etmeden açık kapı bıraktığımız durumlar bir süre sonra karmaşık problemler haline geliyor.
Elbet hangi programlama dili olursa olsun xss gibi açıklara dikkat etmek gerekiyor. Çünkü siteyi kullanan kişiye de özelliklerle beraber sunduğumuz açıklar oluyor. Veritabanı üzerinde okunacak veya yazılacak bilgilere de dikkat etmek en önemlisi. bir şekilde zararlı kodlara mahal vermemek için yapılacak yöntemlerde hayli mevcut.
Bunlar da bir kenarda dursun. Chrome ya da Mozilla gibi tarayıcılarda kullanıcı development mode ile sitenin kodları ile local olarak düzenleme yapabiliyor.
Örnek senaryo ;
Sadece bir birileriyle veritabanında iletişim kurabilecek insanların yer aldığı bir mesajlaşma sistemi olsun. Kullanıcıların profil sayfaları var. Mesaj göndermek için açılan bir modal var. Mesajın gönderileceği kişinin id numarası input hidden şeklinde yer alıyor. Kullanıcı mesaj göndereceği kişinin id numarasını biliyor. Mesaj gönderecek olan modal açıldığı zaman development mode ile input hidden değerini değiştiriyor. Aslında başka kullanıcıya gidecek olan mesajı göndermek istediği id numarasına gönderebiliyor. Bu elbet istenen bir durum değil. Önüne geçilebilecek bir durum fakat backend kodları ile bu bilgilerin doğruluğunu kontrol etmek yerine. Sayfa üzerindeki bilgilerin düzenlenebilirliğini engelleyen bir sistem daha makul olmaz mı?
Eğer bu mümkünse farklı browserlar ile ya da farklı lokasyonlardan post işlemleri ile kötü niyetli birisi veri alışverişi yapabilir mi?
Js kodları içerisinde aslında verilerin ajax urlsine nasıl gitmesi gerektiği de açık bir şekilde görünebilir durumda. Backend ile oturum kontrollü işlemler de düşünülebilir konu hakkında bilgisiz olmak beni korkutmaya başlıyor. Yapmış olduğum bu gibi çalışmalarda hata yapmış olmam bile beni ürkütüyor çünkü baştan hepsini düzenlemek kabustan başka bir şey olamaz.
Aynı durumu aslında Android uygulamalar ile webservislerle de yaşanabilir. Tespitinin mümkün olması durumunda zafiyetimiz de gözükecek.
Bir ara modem arayüzünde böyle bir girişimde bulunmuştum. Inputlar üzerinde oynayarak bırakmış olduğu sınırları değiştirmek istedim. ILLEGAL gibi bir yazı okudum yanlış hatırlamıyorsam. Fakat şimdi kendi sitemde deniyorum. Farklı bir lokasyondan bağlanarak backend ile görsel olarak bırakmış olduğum sınırların dışına çıkabildim. Dahil etmem gereken bir güvenlik fonksiyonu mu var?
jquery security + browser +xss +cross domain vb. arama sonuçlarında bir şey bulamadım.
form token ile ilgili dökümanlar buldum ama aradığım şey bu değil sanırım.
Bu konu için aslında yapılması gerekenler nedir?
Teşekkürler.
Fakat yapmayı öğrenmek ile baya bir zaman geçirdikten sonra yüksek hiti olan sitelerdeki performans ya da fark etmeden açık kapı bıraktığımız durumlar bir süre sonra karmaşık problemler haline geliyor.
Elbet hangi programlama dili olursa olsun xss gibi açıklara dikkat etmek gerekiyor. Çünkü siteyi kullanan kişiye de özelliklerle beraber sunduğumuz açıklar oluyor. Veritabanı üzerinde okunacak veya yazılacak bilgilere de dikkat etmek en önemlisi. bir şekilde zararlı kodlara mahal vermemek için yapılacak yöntemlerde hayli mevcut.
Bunlar da bir kenarda dursun. Chrome ya da Mozilla gibi tarayıcılarda kullanıcı development mode ile sitenin kodları ile local olarak düzenleme yapabiliyor.
Örnek senaryo ;
Sadece bir birileriyle veritabanında iletişim kurabilecek insanların yer aldığı bir mesajlaşma sistemi olsun. Kullanıcıların profil sayfaları var. Mesaj göndermek için açılan bir modal var. Mesajın gönderileceği kişinin id numarası input hidden şeklinde yer alıyor. Kullanıcı mesaj göndereceği kişinin id numarasını biliyor. Mesaj gönderecek olan modal açıldığı zaman development mode ile input hidden değerini değiştiriyor. Aslında başka kullanıcıya gidecek olan mesajı göndermek istediği id numarasına gönderebiliyor. Bu elbet istenen bir durum değil. Önüne geçilebilecek bir durum fakat backend kodları ile bu bilgilerin doğruluğunu kontrol etmek yerine. Sayfa üzerindeki bilgilerin düzenlenebilirliğini engelleyen bir sistem daha makul olmaz mı?
Eğer bu mümkünse farklı browserlar ile ya da farklı lokasyonlardan post işlemleri ile kötü niyetli birisi veri alışverişi yapabilir mi?
Js kodları içerisinde aslında verilerin ajax urlsine nasıl gitmesi gerektiği de açık bir şekilde görünebilir durumda. Backend ile oturum kontrollü işlemler de düşünülebilir konu hakkında bilgisiz olmak beni korkutmaya başlıyor. Yapmış olduğum bu gibi çalışmalarda hata yapmış olmam bile beni ürkütüyor çünkü baştan hepsini düzenlemek kabustan başka bir şey olamaz.
Aynı durumu aslında Android uygulamalar ile webservislerle de yaşanabilir. Tespitinin mümkün olması durumunda zafiyetimiz de gözükecek.
Bir ara modem arayüzünde böyle bir girişimde bulunmuştum. Inputlar üzerinde oynayarak bırakmış olduğu sınırları değiştirmek istedim. ILLEGAL gibi bir yazı okudum yanlış hatırlamıyorsam. Fakat şimdi kendi sitemde deniyorum. Farklı bir lokasyondan bağlanarak backend ile görsel olarak bırakmış olduğum sınırların dışına çıkabildim. Dahil etmem gereken bir güvenlik fonksiyonu mu var?
jquery security + browser +xss +cross domain vb. arama sonuçlarında bir şey bulamadım.
form token ile ilgili dökümanlar buldum ama aradığım şey bu değil sanırım.
Bu konu için aslında yapılması gerekenler nedir?
Teşekkürler.
arkaplanda php, asp.net felan çalışmıyor mu?
- masa penisi (29.09.15 19:09:31)
1. tüm güvenlik server tarafinda saglanmali. yani kullanici bir javascript parametresinde id yi degisirip hakki olmadigi halde o id ile ilgili degisiklik yapamamali. tüm kontroller server tarafinda yapilmali. Client yani kullani tarafinda yapilan kontroller ise sadece o kullanicinin konforu icin yapilmali yani yanlis yere tiklamasin, tikadiginda bu isleme yetkiniz yok hatasi almasin diye önceden tiklamamasi gereken alanin yetkisini kontrol edip gizlemek iyi olur. ama adam o alani kodlarla oynayip gösterirse ve tiklarsa hata alacaktir, onu kendi bilir. yani kisaca client tarafinda ne kadar önlem alirsan al mutlak cözümü yok, server tarafi bu konuda tek sorumlu.
2. http istekleri 3. kislerin dinlemesinden saklanmasi isteniyorsa https kullanilmali.
3. eger bir web service kullaniliyorsa oauth ile authorization mekanizmasi kurulmali. token ve api key gibi güvenlik kontrolu yapilabilicek parametreler olusturulmali. facebook, twitter kullandiklari API ler icin oauth2 kullaniyorlar.
4. yine de yeterli olmazsa güvenli kriptografi yöntemleri kullanilabilir. Cesitli "public key cryptography" yöntemleri bu konuda denenebilir. bu konuda arastirma icin kullanilacak anahtar kelimeler: MD5, SHA-1, SHA-2, AES.
Yani özetle kullanici tarafinda güvenlikle ilgili hicbirsey yapilmaz, cünkü güvenilmez. Sadece kullanici dostu özellikler eklersin, gizle, gösterme vs. Güvenlik icin paketler gidip gelirken biri dinlemesin diye https veya bir baska kriptografik yöntem ile yolda, ya da server tarafinda authorization, authentication ile yapilmali.
2. http istekleri 3. kislerin dinlemesinden saklanmasi isteniyorsa https kullanilmali.
3. eger bir web service kullaniliyorsa oauth ile authorization mekanizmasi kurulmali. token ve api key gibi güvenlik kontrolu yapilabilicek parametreler olusturulmali. facebook, twitter kullandiklari API ler icin oauth2 kullaniyorlar.
4. yine de yeterli olmazsa güvenli kriptografi yöntemleri kullanilabilir. Cesitli "public key cryptography" yöntemleri bu konuda denenebilir. bu konuda arastirma icin kullanilacak anahtar kelimeler: MD5, SHA-1, SHA-2, AES.
Yani özetle kullanici tarafinda güvenlikle ilgili hicbirsey yapilmaz, cünkü güvenilmez. Sadece kullanici dostu özellikler eklersin, gizle, gösterme vs. Güvenlik icin paketler gidip gelirken biri dinlemesin diye https veya bir baska kriptografik yöntem ile yolda, ya da server tarafinda authorization, authentication ile yapilmali.
- emrahday (29.09.15 19:13:58 ~ 19:22:09)
@masa penisi arka planda php var.
@emrahday ayrıntılı açıklaman için teşekkür ederim fakat moralim bozuldu. Bunca yaptığım şey o zaman ters duruyor.
Peki en azından development modeda ILLEGAL gibi yazılar nasıl gösteriliyor. Bu konu tam olarak ne ile alakalı? Gördüğüm modem arayüzündeki o olay neydi? Bahsettiğiniz şeylerle mi alakalı?
@emrahday ayrıntılı açıklaman için teşekkür ederim fakat moralim bozuldu. Bunca yaptığım şey o zaman ters duruyor.
Peki en azından development modeda ILLEGAL gibi yazılar nasıl gösteriliyor. Bu konu tam olarak ne ile alakalı? Gördüğüm modem arayüzündeki o olay neydi? Bahsettiğiniz şeylerle mi alakalı?
- kvlknctk (29.09.15 19:26:08)
büyük ihtimalle modem ajax ile asynchronous validasyon istegi göndermistir, mesela bir <input> alani sadece 0 ile 10 arasindaki rakamlari kabul ediyordur. bunu javascript tarfinda regular express ile kontrolünü yapiyordur, kullanici 15 girdiginde gereksiz yere hata mesaji almasin diye. benzer sekilde regular expressi degistirip araligi kullanici 0 - 20 arasinda aldigini farzedelim, bu durumda kullanici sadece kendisini kandirir. <input> alninin "onkeyup" yani klavye tusunu biraktiginda bir validation request gönderir arka planda bu da serverda bu 0 - 10 arasinda mi kontrolü yapar. sen 15 gönderebilirsin ama serverdan geri döner. büyük ihtimalle modemde de ayni durum söz konusu.
moralini bozma, tam güvenligi asla saglayamayacaksin zaten. gördügün tespit edebildigin güvenlik aciklari arka tarafta back-end de kapat. peki göremediklerin ne olacak? iste bunun icin web sitesi yazilirken dahi "unit test" yazilmasi gerekiyor. mocha.js, jasmine js, jsunit gibi javascript unit test araclarini incelemeni tavsiye ederim. onun disinda arka tarafta da hangi dili kullaniyorsan o dilin unit test araclarini kullanman yararina olur. bu konuda youtube da cok güzel anlatimlar var. unit test yazarak hem gelistirme yaparken "spagetti code" yazmaktan kendini korursun hem de "burayi degistirdim cok sacma seyler oluyor, niye ki?" diye kendine sordugun durumlar azalir. Testlerinin icine olmamasi gereken degerlerini yazip izlersin bakalim ne oluyor, güvenlikten geciyor mu diye. Bunun yaninda Test Driven Development konusunu da incelemeni tavsiye ederim. Dünyadaki google gibi büyük sirketlerin gelistiricileri sadece bu yönelim (approach) ile gelistirme yaparlar.
Yani kisaca bu sürec hic bitmez, sen acigini kaparsin baskalari yenisini bulur, bunu cözsen DDoS atak problemlerini de cözmen gerekli, ki hala bi bile tam olarak cözülemedi.
moralini bozma, tam güvenligi asla saglayamayacaksin zaten. gördügün tespit edebildigin güvenlik aciklari arka tarafta back-end de kapat. peki göremediklerin ne olacak? iste bunun icin web sitesi yazilirken dahi "unit test" yazilmasi gerekiyor. mocha.js, jasmine js, jsunit gibi javascript unit test araclarini incelemeni tavsiye ederim. onun disinda arka tarafta da hangi dili kullaniyorsan o dilin unit test araclarini kullanman yararina olur. bu konuda youtube da cok güzel anlatimlar var. unit test yazarak hem gelistirme yaparken "spagetti code" yazmaktan kendini korursun hem de "burayi degistirdim cok sacma seyler oluyor, niye ki?" diye kendine sordugun durumlar azalir. Testlerinin icine olmamasi gereken degerlerini yazip izlersin bakalim ne oluyor, güvenlikten geciyor mu diye. Bunun yaninda Test Driven Development konusunu da incelemeni tavsiye ederim. Dünyadaki google gibi büyük sirketlerin gelistiricileri sadece bu yönelim (approach) ile gelistirme yaparlar.
Yani kisaca bu sürec hic bitmez, sen acigini kaparsin baskalari yenisini bulur, bunu cözsen DDoS atak problemlerini de cözmen gerekli, ki hala bi bile tam olarak cözülemedi.
- emrahday (29.09.15 19:42:29 ~ 19:46:52)
1