flawopen.com/Injeksi SQL di Go/GORM Raw SQL dan injeksi SQL
Apakah GORM Raw() aman dari injeksi SQL? Pengikatan parameter di Go
Bayangkan placeholder sebagai amplop tertutup untuk sebuah nilai: driver database mengirim nilai secara terpisah dari instruksi SQL. GORM Raw() dapat mengikat nilai dengan aman jika placeholder tetap berada di kueri dan nilainya diberikan sebagai argumen. Memformat input pengguna ke string SQL mencampur amplop dengan instruksi dan dapat mengubah kueri.
// Teks yang dikendalikan pengguna menjadi sintaks SQL db.Raw(fmt.Sprintf( "SELECT * FROM users WHERE id = %s", userID, )).Scan(&user)
// Driver mengikat userID sebagai nilai db.Raw( "SELECT * FROM users WHERE id = ?", userID, ).Scan(&user)
Aturan aman GORM Raw SQL dan pengikatan parameter
GORM dan Go database/sql mengikat nilai saat placeholder tetap berada di SQL dan argumen dikirim terpisah, misalnya db.Where("name = ?", userInput) atau db.Raw("SELECT ... WHERE id = ?", userID). Placeholder mewakili nilai, bukan sintaks SQL: nama tabel, kolom, arah pengurutan, dan operator tidak dapat diamankan dengan pengikatan nilai. Pilih identifier dinamis dari allowlist tetap. Metode seperti Order, Select, Table, dan Raw dapat rentan jika input pengguna digabungkan ke fragmen SQL.
- ✓Pertahankan struktur SQL tetap dan kirim setiap nilai pengguna sebagai argumen placeholder terpisah.
- ✓Pilih nama tabel, kolom, dan pengurutan dinamis dari allowlist tetap milik aplikasi.
- ✓Tinjau metode fragmen SQL seperti
Raw,Exec,Order,Select, danTableuntuk menemukan penggabungan atau pemformatan. - ✓Konversi identifier numerik ke tipe Go yang diharapkan dan tangani error sebelum kueri.
Cara memeriksa codebase
rg -n --glob '*.go' '\.(Raw|Exec|Order|Select|Table)\s*\(' .
rg -n --glob '*.go' 'fmt\.(Sprintf|Sprint)' .FAQ GORM Raw SQL dan pengikatan parameter
Tidak. Kondisi yang mengirim nilai secara terpisah, seperti Where("name = ?", input), memakai pengikatan parameter. Menggabungkan input ke string kondisi atau memberikannya sebagai sintaks SQL mentah tetap dapat menyuntikkan kueri. Beberapa metode menerima identifier atau fragmen SQL yang tidak di-escape; tinjau argumennya dan gunakan allowlist untuk struktur dinamis.
Tidak. Placeholder mewakili nilai data. Untuk identifier atau arah pengurutan dinamis, pilih opsi tetap yang ditentukan aplikasi dan masukkan hanya konstanta tervalidasi ke struktur SQL.
Sumber resmi dan referensi
- Dokumentasi GORM — metode berisiko injeksi SQL
- Dokumentasi GORM — SQL mentah dan kueri berparameter
- flawopen.com — injeksi SQL di Go