FlawOpen

flawopen.com/SQL Injection di Ruby/ActiveRecord where()

Apakah interpolasi string di Rails where() aman?

Halaman referensi
Jawaban singkat

Bayangkan SQL sebagai formulir dengan instruksi tetap dan kotak kosong untuk nilai. Parameter terikat hanya mengisi kotak; interpolasi Ruby menyisipkan teks permintaan ke instruksi sebelum Rails dapat memisahkan keduanya. Pertahankan struktur SQL dan kirim nilai yang tidak tepercaya sebagai parameter.

UNSAFE
User.where(
  "id = #{params[:id]}"
)
SAFE
User.where(id: params[:id])
# or, for more complex conditions:
User.where("id = ?", params[:id])

Mengapa interpolasi mengubah kueri

Ruby mengevaluasi #{...} sebelum Active Record menerima kondisi. Contohnya, where("id = #{params[:id]}") memberikan string SQL yang sudah digabung kepada Rails; masukan permintaan kemudian dapat mengubah predikat. Active Record mendokumentasikan pola perakitan string ini sebagai tidak aman. Gunakan hash untuk kondisi kesetaraan, rentang, atau subset yang didukung, atau placeholder ? untuk predikat lain. Placeholder mengikat nilai, bukan identifier atau kata kunci SQL; pertahankan struktur kueri atau pilih identifier dari allowlist yang ketat.

Cara memeriksa basis kode

rg -n 'where\s*\(' app/
Tinjau hasil untuk menemukan data permintaan yang diinterpolasi atau digabungkan ke dalam string kondisi. Brakeman melaporkan risiko SQL Injection ketika analisisnya menemukan aliran data yang tidak aman; pemindaian bersih tidak membuktikan semua kueri aman.

Pertanyaan umum

Bisakah kondisi hash dipakai untuk semua kueri?

Tidak. Kondisi hash Rails mendukung kesetaraan, rentang, dan subset (IN). Untuk predikat lain, gunakan kondisi SQL tetap dengan nilai terikat, misalnya where("price > ?", amount). Binding melindungi nilai; ini tidak mengamankan nama tabel/kolom dinamis atau fragmen SQL.

Referensi

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah Sequelize query() aman dari SQL Injection? Apakah SQLAlchemy text() aman dari SQL Injection? Apakah pemeriksaan query sqlx saat kompilasi mencegah SQL injection? Apakah stored procedure kebal terhadap SQL injection? Apakah TypeORM QueryBuilder aman dari SQL Injection? Django ORM SQL Injection: pola aman