Mencegah SQL Injection di Go Postgresql
Oct 02 2020
Saya meneliti di sekitar forum injeksi postgresql di Go dan saya menemukan beberapa informasi berguna dalam injeksi SQL seperti di bawah ini:
Bagaimana cara menjalankan pencarian IN di SQL menggunakan Golang?
Bagaimana cara mencegah serangan injeksi SQL di Go saat menggunakan "database / sql"?
tetapi saya masih memerlukan beberapa saran karena kode saya di Go menggunakan jenis kode dan usecases yang berbeda. beberapa kasus penggunaan / pertanyaan yang saya butuhkan sarannya adalah seperti ini
- Menggunakan perulangan kueri ke beberapa penyisipan seperti
INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)menggunakan fmt.Sprintf, saya tahu menggunakan sprinft itu buruk. jadi apakah ada solusi untuk kueri loop ini untuk disisipkan? Ex:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s) - Apakah aman menggunakan fmt.Sprintf untuk menghasilkan kueri jika yang digunakan param,
%dbukan%s? - Menggunakan pernyataan Siapkan dan Kueri aman, tetapi bagaimana jika saya menggunakan Pilih fungsi (menggunakan $1,$2) dan fungsi NamedQuery (menggunakan nama struct.) Contoh:
Select * from a where text = $1-> apakah menggunakan$1brankas ini ? dan Contoh:Select * from a where text = :text-> apakah ini aman dalam fungsi NamedQuery?
Mohon saran Anda guys. Terima kasih!
Jawaban
5 KennyGrant Oct 02 2020 at 18:20
Pertama, biasanya lebih suka menggunakan placeholder db? $ 1 dll.
- Ya, aman untuk menggunakan fmt.Sprintf dengan parameter integer untuk membangun SQL, meskipun layak dihindari jika Anda bisa, tetapi parameter ketiga Anda adalah% s - hindari itu dan gunakan?
- Ya, aman untuk menggunakan fmt.Sprintf dengan parameter integer, tetapi% s atau% v jauh lebih berisiko dan saya akan menghindar, tidak dapat memikirkan mengapa Anda membutuhkannya.
- Gunakan placeholder di sini, maka ya aman.
Aturan umum:
- Gunakan placeholder secara default, seharusnya jarang menggunakan% d (seperti dalam kueri IN Anda misalnya)
- Parsing params menjadi tipe seperti integer sebelum validasi atau penggunaan apa pun
- Hindari string concat jika Anda bisa, dan berhati-hatilah dengan parameter string
- Selalu kode keras hal-hal seperti nama kolom dan tabel, jangan pernah membuatnya dari input pengguna (misalnya? Sort = mystringcolname)
- Selalu validasi bahwa parameter yang Anda dapatkan hanya yang diotorisasi untuk pengguna tersebut
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'