istemediğin kadar açık vardır muhtemel :) aklıma gelenleri yazayım
web uygulama ise;
content security için aşağıdaki başlıklar önemlidir.
- Strict-Transport-Security
- X-Frame-Options
- X-XSS-Protection
- X-Content-Type-Options
XSS
XSRF-TOKEN
Cookie'lerin sunucu tarafında secure işaretli olmalı
Clickjacking
Host header kısıtlaması
Http metodlarının hepsi desteklenmemeli
username/password gibi önemli bilgi alanlarının tarayıcıda saklanmaması
jQuery kullanıldıysa, istemediğinde kadar açığı var.
Sırf bu yüzden artık jQuery kullanmıyoruz. Angular8+, Vue.js 2+ versiyonlarını tercih ediyoruz. Client side tarafında çoğu açığı framework seviyesinde handle ediyorlar.
URL'lerin yetkilendirmelerinin yapılması(authentication, authorization)
Admin'in eriştiği bir API'ye, yetkisiz bir kullanıcı istek atamamalı gibi :)
Ya da admin'in eriştiği bir ekran html'ini, yetkisiz bir kullanıcı bir şey yapamasa dahi html sayfa render edilmemeli
giriş sayfalarına recaptcha uygulanması + username/password denemelerinde 3,5 deneme hakkı sonrasındai ip bazlı süreli bloklama işlemi
Şifremi unuttum sayfasına captcha koyulması ve limitasyonlar eklenmeli
User/pass denemelerinde kullanıcıya verilen mesajlar çok yönlendirici olmamalı
Örnek : Şifresini hatalı giren birine : Kullanıcı ad veya şifreniz hatalı diye genel mesaj dön
Şifremi unuttum işlemi yapan birisine, email bulunamadı gibi bir hata dönme, belirtilen email adresine şifre sıfırlama linki gönderildi şeklinde genel bilgi dön.
Network tarafında client - server arasındaki bağlantı önem arzediyor. https olması aşırı önemlidir. Ksinlikel client - server arasında karşılıklı two side sertifika olmalıdır.
DB tarafında ise sql injection en büyük bela.. bunun için ORM gibi araçlar kullanılması önemlidir.
Dİnamik elle oluşturulmuş, query'ler rahatça client - server arasındaki data akışında manuğile edilip, db tarafına efso sorgular atılabilir.
mesela;
ekrandan bir kullanıcıyı seçip, mesaj kutusuna bir şey yazdınız.
backend'e giden istekte ;
fromUserId, toUserId,message,createDate gibi değerler olacaktır.
karşı tarafta ise mesaj kutusunu açtığında yada sayfada refresh işlemi yaptığında ;
DB'ye select message from messages where userId = 1 order by createDate asc; benzer yada farklı bir sorgu atıyordur.
userId = 1 <- 1 olan parametre yi tarayıcıda debug'da durdurup, "1 or 1=1" şeklinde gönderirseniz muhtemel messages tablosundaki tüm değerleri görecektir.
uygulama - db arasında sağlam bir network i/o + memory consumption, db tarafında file i/o ve memory consumption oluşturacaktır.
aklıma gelenleri hızlıca yazdım kolay gelsin:)
yazılım güvenliği çok ayrı bir uzmanlık alanıdır ve çok geniştir. Uzmanından destek almakta fayda var.