flawopen.com/SQL Injection/Apakah ORM cukup?
Apakah memakai ORM cukup untuk mencegah injeksi SQL?
ORM ibarat dapur yang menyiapkan pesanan dari formulir: query builder biasa memisahkan nilai. Jalan pintas SQL mentah adalah jalur lain dengan aturannya sendiri. Periksa API tepatnya sebelum memercayai nilai interpolasi.
var sql = $"SELECT * FROM dbo.Blogs WHERE Url = '{url}'";
var rows = await context.Blogs
.FromSqlRaw(sql)
.ToListAsync();
// User text is inserted into SQL before execution.
var rows = await context.Blogs
.FromSql($"SELECT * FROM dbo.Blogs WHERE Url = {url}")
.ToListAsync();
// EF Core 7+: interpolation becomes a SQL parameter.
Pola yang sama di setiap ORM
Query builder ORM dan API SQL mentah bukan satu batas keamanan yang seragam. Dokumentasi resmi menjelaskan pengikatan nilai yang aman pada Django raw(sql, params), SQLAlchemy text() dengan parameter eksekusi terpisah, kondisi placeholder Rails, EF Core 7+ FromSql / FromSqlInterpolated, GORM Raw(sql, args...), dan $queryRaw bertemplate tag Prisma. Perilaku API mentah berbeda: FromSqlRaw aman dengan parameter terpisah, tetapi tidak jika teks pengguna disisipkan ke string SQL; $queryRawUnsafe juga dapat mengikat nilai terpisah, tetapi penggabungan teks tak tepercaya tetap berbahaya. Nama metode saja tidak membuktikan cara nilainya diproses. Ikat setiap data melalui mekanisme yang didokumentasikan API. Identifier dan struktur SQL tidak dapat diikat sebagai nilai; pilih dari allowlist tetap milik aplikasi. Panduan framework di bawah menjelaskan kontraknya.
Apa yang sebenarnya dituntut oleh "cukup"
- ✓Gunakan query builder ORM untuk nilai dan filter biasa.
- ✓Untuk SQL mentah, ikat setiap nilai melalui mekanisme parameter API.
- ✓Pilih identifier dinamis dari allowlist tetap milik aplikasi; parameter tidak dapat mengikat struktur SQL.
- ✓Tinjau pemanggilan SQL mentah untuk konkatenasi, interpolasi, dan varian metode berisiko.
FAQ
Tidak. Beberapa API SQL mentah mengikat nilai yang diberikan terpisah, dan API aman tertentu menerima nilai interpolasi sebagai parameter. FromSql EF Core 7+ menerima FormattableString, sedangkan FromSqlRaw memerlukan parameter terpisah. $queryRawUnsafe Prisma juga dapat mengikat nilai, tetapi tidak menyanitasi teks SQL yang Anda susun. Periksa kontrak metode dan jauhkan nilai tak tepercaya dari struktur SQL.
Referensi
- Kueri SQL Django
- SQLAlchemy DBAPI
- Rails Active Record
- Kueri SQL EF Core
- GORM Keamanan
- Kueri mentah Prisma
- Panduan Django
- Panduan SQLAlchemy
- Panduan Rails
- Panduan EF Core
- Panduan GORM
- Panduan Prisma