Node.js Geliştiricilerinin Canlı Ortama Çıkardığı Güvenlik Hataları

Geçen yıl bir girişim için kod incelemesi yaptım. Kod temiz görünüyordu. Testler başarıyla geçiyordu.

Sonra şu satırı gördüm: const query = SELECT * FROM users WHERE email = '${req.body.email}'``

Bu bir SQL injection hatasıdır. Girişim bunu 8 ay boyunca canlı ortamda çalıştırdı. Hiçbir geliştirici veya CTO bunu fark etmedi.

Bu hatalar görünmezdir çünkü kod çalışır. Bir kullanıcı bir giriş alanına kötü niyetli bir komut yazana kadar her şey yolunda gider.

Bu 5 yaygın hatayı durdurun:

  1. Kullanıcı girdisiyle birlikte ham SQL kullanımı Sorgular için template literal kullanmayın. Bu, saldırganların veritabanınıza erişmesine olanak tanır.
  • Kötü: const query = SELECT * FROM users WHERE email = '${email}'``
  • İyi: Parametreli sorgular kullanın. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Git üzerinde gizli bilgilerin sızdırılması Geliştiriciler genellikle .env dosyalarını depolara (repositories) commit ederler. Bu durum, veritabanı URL'lerinizi ve API anahtarlarınızı açığa çıkarır. .env dosyasını her zaman .gitignore dosyanıza ekleyin.

  2. jwt.verify yerine jwt.decode kullanmak jwt.decode sadece token'ı okur. Token'ın gerçek olup olmadığını kontrol etmez. Herkes çözülmüş (decoded) bir token sahtesini oluşturabilir.

  • Kötü: const user = jwt.decode(token)
  • İyi: Her zaman imzayı doğrulayın. const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Kimlik doğrulama (auth) uç noktalarında hız sınırlamasının (rate limiting) eksikliği Hız sınırlaması olmadan, saldırganlar brute force yöntemiyle milyonlarca şifre deneyebilir. Giriş denemelerini sınırlamak için bir kütüphane kullanın.
  • İyi: 15 dakika başına 10 deneme sınırı ekleyin.
  1. Ayrıntılı hata mesajları Ham hata mesajlarını istemciye (client) göndermek, saldırganların sisteminizi haritalandırmasına yardımcı olur. Tablo adlarınızı ve veritabanı türlerinizi görürler.
  • Kötü: res.status(500).json({ error: error.message })
  • İyi: Hatayı dahili olarak kaydedin (log). Kullanıcıya genel bir mesaj gönderin. res.status(500).json({ error: 'Something went wrong' })

Bir uç noktayı (endpoint) canlıya almadan önce kendinize şu soruyu sorun: Bir kullanıcı beklenmedik bir veri gönderirse ne olur?

Güvenlik hataları nadiren karmaşıktır. Kötü niyetli aktörleri düşünmeyi unuttuğunuzda ortaya çıkarlar.

Canlı ortamda hangi güvenlik hatasıyla karşılaştınız?

Kaynak: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6