FlawOpen

flawopen.com/SQL Injection di C#/NHibernate

Apakah NHibernate aman dari SQL Injection?

Panduan referensi
Jawaban singkat

Parameter terikat seperti kartu nilai tersegel dalam formulir kueri: database memperlakukannya sebagai data, bukan instruksi. Parameter HQL NHibernate memisahkan nilai. Menginterpolasi teks yang tidak tepercaya ke HQL atau SQL membuatnya kembali menjadi bagian dari bahasa kueri.

TIDAK AMAN — interpolasikan input ke HQL
var hql =
  $"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
  .UniqueResult<User>();
DIPERKUAT — ikat nilai ke parameter HQL
var user = session.CreateQuery(
    "from User u where u.Id = :id")
  .SetParameter("id", userId)
  .UniqueResult<User>();

Ikat nilai; batasi struktur kueri

SetParameter() mengirim nilai terpisah dari teks HQL. Gunakan parameter bernama atau posisi untuk setiap nilai yang tidak tepercaya. Kueri SQL native juga mendukung parameter bernama dan posisi; gunakan metode pengikatan ISQLQuery yang sesuai (misalnya, SetString() untuk nilai teks). Parameter bukan untuk nama entitas atau properti, arah pengurutan, atau fragmen kueri; semua itu struktur kueri. Petakan pilihan properti ke kumpulan fragmen HQL tetap yang ditentukan aplikasi. Parameterisasi mencegah nilai diperlakukan sebagai sintaks, tetapi tidak menentukan hak pengguna atas record.

Pertanyaan umum

Apakah parameterisasi HQL juga memberi izin mengakses record?

Tidak. Otorisasi tetap harus membatasi kueri pada record yang boleh diakses pengguna saat ini, misalnya dengan filter akun atau tenant terautentikasi.

Referensi

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Injeksi NoSQL MongoDB: filter kueri aman Apakah format string berbahaya untuk ID numerik? Apa itu kueri terparameterisasi? Apakah Prisma $queryRaw aman dari SQL Injection? Apakah interpolasi string di Rails where() aman? Apakah Sequelize query() aman dari SQL Injection?