flawopen.com/SQL Injection di JavaScript/Sequelize
Apakah Sequelize query() aman dari SQL Injection?
Parameter kueri seperti kartu nilai tersegel: SQL menerima nilai secara terpisah dari instruksi kueri. Di Sequelize v6, bind mengirim nilai secara terpisah; replacements melakukan escape dan menyisipkan nilai sebelum pengiriman. Merakit string dengan input tidak tepercaya melewati keduanya. Keduanya tidak dapat menggantikan nama tabel atau kolom.
sequelize.query(
`SELECT * FROM users WHERE id = ${userId}`
)
sequelize.query(
"SELECT id FROM users WHERE id = $id",
{ bind: { id: userId },
type: QueryTypes.SELECT }
)
Pisahkan nilai dari sintaks SQL
Di Sequelize v6, Sequelize melakukan escape dan menyisipkan replacements sebelum kueri dikirim ke database; bind mengirim nilai terpisah dari teks SQL. Keduanya menghindari penggabungan nilai pengguna, tetapi sintaks berbeda menurut metode dan dialek. Parameter bukan untuk nama tabel, kolom, urutan, atau fragmen SQL bebas. Petakan struktur yang dapat dipilih ke allowlist tetap milik aplikasi. Metode model menangani nilai terstruktur umum, tetapi raw SQL dan ekspresi literal tetap perlu ditinjau.
Cara mengaudit konstruksi kueri Sequelize
rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .Pertanyaan umum
Nilai terstruktur biasa ditangani konstruksi kueri Sequelize. Namun, tinjau raw SQL, ekspresi literal, dan string yang dirakit aplikasi. Parameterisasi tidak mengotorisasi akses record atau memvalidasi aturan bisnis.
Referensi
- Dokumentasi Sequelize v6 — Raw Queries, replacements, dan parameter bind
- OWASP — Pencegahan SQL Injection
- flawopen.com — SQL Injection di JavaScript