Bug Keamanan yang Sering Dirilis oleh Developer Node.js ke Produksi

Saya meninjau kode untuk sebuah startup tahun lalu. Kodenya terlihat bersih. Tesnya pun lolos.

Kemudian saya melihat baris ini: const query = \SELECT * FROM users WHERE email = '${req.body.email}'``

Ini adalah bug SQL injection. Startup tersebut menjalankan kode ini di produksi selama 8 bulan. Tidak ada developer atau CTO yang menyadarinya.

Bug ini tidak terlihat karena kodenya berfungsi. Kode tersebut akan terus berjalan sampai ada pengguna yang mengetikkan perintah berbahaya ke dalam kolom input.

Hentikan 5 kesalahan umum ini:

  1. SQL mentah dengan input pengguna Jangan gunakan template literals untuk query. Hal ini memungkinkan penyerang untuk mengakses database Anda.
  • Buruk: const query = \SELECT * FROM users WHERE email = '${email}'``
  • Baik: Gunakan parameterized queries. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. Membocorkan rahasia di Git Developer sering kali melakukan commit file .env ke repositori. Ini mengekspos URL database dan API key Anda. Selalu tambahkan .env ke file .gitignore Anda.

  2. Menggunakan jwt.decode alih-alih jwt.verify jwt.decode hanya membaca token. Ia tidak memeriksa apakah token tersebut asli. Siapa pun dapat memalsukan token yang telah didekode.

  • Buruk: const user = jwt.decode(token)
  • Baik: Selalu verifikasi tanda tangannya (signature). const user = jwt.verify(token, process.env.JWT_SECRET)
  1. Kurangnya rate limiting pada endpoint autentikasi Tanpa rate limiting, penyerang dapat mencoba jutaan kata sandi melalui brute force. Gunakan library untuk membatasi upaya login.
  • Baik: Tambahkan batas 10 upaya per 15 menit.
  1. Pesan error yang terlalu detail (verbose) Mengirimkan pesan error mentah ke client membantu penyerang memetakan sistem Anda. Mereka dapat melihat nama tabel dan jenis database Anda.
  • Buruk: res.status(500).json({ error: error.message })
  • Baik: Catat (log) error secara internal. Kirimkan pesan umum kepada pengguna. res.status(500).json({ error: 'Something went wrong' })

Sebelum Anda merilis sebuah endpoint, ajukan satu pertanyaan: Apa yang terjadi jika pengguna mengirimkan data yang tidak terduga?

Bug keamanan jarang sekali bersifat kompleks. Bug tersebut terjadi ketika Anda lupa memikirkan potensi aktor jahat.

Bug keamanan apa yang pernah Anda temukan di produksi?

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