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.