FlawOpen

flawopen.com/SQL Injection/Apakah ORM cukup?

Apakah memakai ORM cukup untuk mencegah injeksi SQL?

Halaman referensi
Jawaban singkat

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.

TIDAK AMAN — teks pengguna di SQL FromSqlRaw
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.
AMAN — bind dengan FromSql (EF Core 7+)
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"

FAQ

Apakah metode SQL mentah selalu tidak aman?

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

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah Knex.js aman dari SQL Injection? MyBatis ${} vs #{}: mencegah SQL Injection MySQLi vs PDO: prepared statement yang aman Apakah NHibernate aman dari SQL Injection? Injeksi NoSQL MongoDB: filter kueri aman Apakah format string berbahaya untuk ID numerik?