flawopen.com/SQL Injection di C#/NHibernate
Apakah NHibernate aman dari SQL Injection?
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.
var hql =
$"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
.UniqueResult<User>();
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
Tidak. Otorisasi tetap harus membatasi kueri pada record yang boleh diakses pengguna saat ini, misalnya dengan filter akun atau tenant terautentikasi.
Referensi
- Referensi NHibernate — HQL: Hibernate Query Language
- Referensi NHibernate — SQL native
- OWASP — Pencegahan SQL Injection
- flawopen.com — SQL Injection di C#