Node.js daha çok genç ve bu yüzden saldırılar konusunda güvenlik önlemleri sürekli olarak geliştiriliyor.Bu yüzden sürekli olarak update edilen bir sistem ile çalışmak zorundasınız.Peki bu konuda bizim yapabileceğimiz neler var bir bakalım.

Express'in eski sürümlerini kullanmayın

Express modülünün şu anda kullanmamızı tavsiye ettiği sürüm 4x ' dir ve güvenlik ve performansı sürekli düzeltiliyor; fakat 2x ve 3x sürümlerinde böyle bir durum söz konusu değil.

TLS kullanın

Öncelikle nedir bu TLS onunla başlayalım.
TLS : Açılımı Transport Layer Security yani Taşıma Katmanı Güvenliği ' dir.Peki ne işe yarar :
TLS sunucu ve istemci arasındaki iletişimi şifreli olarak yapmaya yarar.SSL ' in bir üst seviyesi denilebilir.

Helmet kullanın

Helmet,HTTP başlıklarını uygun şekilde ayarlayarak bazı yaygın web açıklarından korur.

Yetkilendirmeye karşı kaba kuvvet saldırılarını önleyin.

Burada amaç bazı kullanıcıların haddinden fazla sunucuya istek göndermesidir.Örneğin:
Bir kullanıcı var ve bir dakika içerisinde 100 defa oturum açmaya çalışıyor.Bunun sonucunda sisteme fazla yük biner ve bunu düşünün 1000 kişi düşük sistemli bir sunucuda yapıyor.Sonuç olarak sistem çalışamaz hale gelir.Bunu ister kullanıcının ip adresini deneme sayılarından sonra istenilen limite ulaştığında engellersiniz.
İsterseniz de en kısa yoldan rate-limiter-flexible modülünü kullanın.

Uygulamanızın bağımlılıklarında güvenlik açığı var mı?

Node.js uygulaması oluştururken bağımlılıklarda çeşitli güvenlik açıkları olabilir.Bunları gidermek için çeşitli yollar vardır.

- npm audit komutu

Bu komut ile Node.js uygulamanızdaki bağımlılıklarınızın güvenlik açığı bulundurup bulundurmadığını kontrol edebilirsiniz.
Çalıştırmak için :
C:\Users\kullanıcı-adınız>npm audit

- Snyk modülü

Snyk modülü ile uygulamanız daha güvende olabilir diyebiliriz.
Öncelikle modülümüzü yükleyelim.Komut satır işlemcimizi (cmd) uygulamamızın bulunduğu klasör üzerinden açıyoruz.
C:\Users\kullanıcı-adınız\uygulama>npm install -g snyk
Bu komut ile modülümüzü ekledik.
C:\Users\kullanıcı-adınız\uygulama>snyk test
Bu komut synk modülümüzü , uygulamamızdaki bağımlıklıklarda güvenlik açığı olup olmadığını test ettirdik.
C:\Users\kullanıcı-adınız\uygulama>snyk wizard
Bu komut ile de bulunan güvenlik açıklarını düzelttik.

Ek güvenlik önlemleri

Aşağıdaki liste Node.js Güvenlik Kontrol Listesinden adresinden alıntılanmıştır.
  • Siteler arası istek sahteciliğine (CSRF) karşı korumak için csurf ara yazılımı kullanın .
  • Siteler arası komut dosyası çalıştırma (XSS) ve komut enjeksiyon saldırılarına karşı korumak için daima kullanıcı girişini filtreleyin ve sterilize edin.
  • SQL enjeksiyon saldırılarına karşı parametreli sorguları veya hazırlanmış ifadeleri kullanarak savun.
  • Uygulamanızdaki SQL enjeksiyon güvenlik açıklarını tespit etmek için açık kaynaklı sqlmap aracını kullanın.
  • SSL şifrelerinizin, anahtarlarınızın ve yeniden anlaşmalarınızın yanı sıra sertifikanızın geçerliliğini test etmek için nmap ve sslyze araçlarını kullanın.
  • Düzenli ifadelerinizin düzenli hizmet reddi saldırılarına karşı duyarlı olmadığından emin olmak için safe-regex kullanın .
  • Çerez güvenliği seçeneklerini ayarlayın

    Güvenliği artırmak için aşağıdaki çerez seçeneklerini ayarlayın:
  • secure - Tarayıcının yalnızca çerezi HTTPS üzerinden göndermesini sağlar.
  • httpOnly - Çerezin, siteler arası komut dosyası çalıştırma saldırılarına karşı korunmaya yardımcı olan istemci JavaScript'le değil yalnızca HTTP (S) üzerinden gönderilmesini sağlar.
  • domain- çerezin alanını gösterir; URL'nin talep edildiği sunucunun etki alanı ile karşılaştırmak için kullanın. Eşleşirlerse, sonraki yol özelliğini kontrol edin.
  • path- Çerezin yolunu gösterir; istek yolu ile karşılaştırmak için kullanın. Eğer bu ve etki alanı eşleşirse, isteği gönderin.
  • expires - kalıcı çerezler için son kullanım tarihi ayarlamak için kullanın.
    cookie-session katman yazılımı için bir örnek :
    var session = require('cookie-session')
    var express = require('express')
    var app = express()
    
    var expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour
    app.use(session({
      name: 'session',
      keys: ['key1', 'key2'],
      cookie: {
        secure: true,
        httpOnly: true,
        domain: 'example.com',
        path: 'foo/bar',
        expires: expiryDate
      }
    }))
    
    Varsayılan oturum çerez adını kullanmayın! Bunun yerine kendiniz belirleyin.( örnekteki name kısmı )