flawopen.com/C# में SQL Injection/NHibernate
क्या NHibernate SQL Injection से बचाता है?
बँधा हुआ parameter query form में रखा सीलबंद मान-कार्ड है: database इसे निर्देश नहीं, डेटा मानता है। HQL parameters मानों को अलग रखते हैं। अविश्वसनीय पाठ को HQL या SQL में interpolate करने पर वह query language का हिस्सा बन जाता है।
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>();
मान बाँधें; query संरचना सीमित करें
SetParameter() मान को HQL पाठ से अलग भेजता है। हर अविश्वसनीय मान के लिए named या positional parameters इस्तेमाल करें। Native SQL queries भी named और positional parameters का समर्थन करती हैं; ISQLQuery का उपयुक्त binding method इस्तेमाल करें (जैसे, string values के लिए SetString())। Parameters entity या property names, sort direction या query fragments के लिए नहीं हैं; वे query संरचना हैं। चुनी जा सकने वाली property को application द्वारा तय HQL fragments की स्थिर सूची से map करें। Parameterization मान को syntax समझे जाने से रोकता है, लेकिन रिकॉर्ड तक पहुँच की अनुमति तय नहीं करता।
अक्सर पूछे जाने वाले प्रश्न
नहीं। Authorization को query उन रिकॉर्ड तक सीमित करनी चाहिए जिन्हें वर्तमान उपयोगकर्ता देख सकता है, जैसे authenticated account या tenant से filter करके।
स्रोत
- NHibernate संदर्भ — HQL: Hibernate Query Language
- NHibernate संदर्भ — Native SQL
- OWASP — SQL Injection रोकथाम मार्गदर्शिका
- flawopen.com — C# में SQL Injection