flawopen.com/SQL Injection/क्या ORM काफ़ी है?
SQL इंजेक्शन रोकने के लिए ORM का उपयोग काफ़ी है?
ORM फ़ॉर्म देखकर ऑर्डर बनाने वाली रसोई जैसा है: सामान्य query builder मान अलग रखता है। Raw-SQL shortcut दूसरा रास्ता है, जिसके अपने नियम हैं। Interpolated values पर भरोसा करने से पहले सटीक API जांचें।
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.
हर ORM में यही पैटर्न
ORM query builders और raw-SQL APIs एक समान सुरक्षा सीमा नहीं हैं। आधिकारिक दस्तावेज़ Django raw(sql, params), अलग execution parameters वाले SQLAlchemy text(), Rails placeholder conditions, EF Core 7+ FromSql / FromSqlInterpolated, GORM Raw(sql, args...) और Prisma tagged-template $queryRaw में सुरक्षित value binding बताते हैं। APIs अलग व्यवहार करती हैं: अलग parameters के साथ FromSqlRaw सुरक्षित है, लेकिन SQL string में user text डालना असुरक्षित है; $queryRawUnsafe भी values अलग bind कर सकता है, पर untrusted text जोड़ना असुरक्षित है। Method name अकेले value handling नहीं बताता। हर data value को documented mechanism से bind करें। SQL identifiers और query structure parameters नहीं हैं; उन्हें application-owned fixed allowlist से चुनें। नीचे के guides में सटीक नियम हैं।
"काफ़ी" वास्तव में क्या माँगता है
- ✓सामान्य मानों और filters के लिए ORM query builder का उपयोग करें。
- ✓Raw SQL में हर मान को API के documented parameter mechanism से bind करें。
- ✓Dynamic identifiers application की fixed allowlist से चुनें; parameters SQL structure bind नहीं कर सकते。
- ✓Raw-query calls में concatenation, interpolation और unsafe variants की समीक्षा करें。
FAQ
नहीं। कुछ raw-SQL APIs अलग से दिए मानों को bind करती हैं और कुछ सुरक्षित APIs interpolated मानों को parameters की तरह लेती हैं। EF Core 7+ FromSql interpolated FormattableString लेता है; FromSqlRaw में parameters अलग देने होते हैं। Prisma $queryRawUnsafe भी values bind कर सकता है, पर आपके बनाए SQL text को sanitize नहीं करता। Method contract जांचें और untrusted values को SQL structure से बाहर रखें।
संदर्भ
- Django SQL queries
- SQLAlchemy DBAPI
- Rails Active Record
- EF Core SQL queries
- GORM सुरक्षा
- Prisma raw queries
- Django गाइड
- SQLAlchemy गाइड
- Rails गाइड
- EF Core गाइड
- GORM गाइड
- Prisma गाइड