FlawOpen

flawopen.com/C# में SQL Injection/NHibernate

क्या NHibernate SQL Injection से बचाता है?

संदर्भ मार्गदर्शिका
संक्षिप्त उत्तर

बँधा हुआ parameter query form में रखा सीलबंद मान-कार्ड है: database इसे निर्देश नहीं, डेटा मानता है। HQL parameters मानों को अलग रखते हैं। अविश्वसनीय पाठ को HQL या SQL में interpolate करने पर वह query language का हिस्सा बन जाता है।

असुरक्षित — input को HQL में interpolate करना
var hql =
  $"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
  .UniqueResult<User>();
सुरक्षित — मान को HQL parameter से बाँधना
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 समझे जाने से रोकता है, लेकिन रिकॉर्ड तक पहुँच की अनुमति तय नहीं करता।

अक्सर पूछे जाने वाले प्रश्न

क्या HQL को parameterize करने से रिकॉर्ड तक पहुँच की अनुमति मिलती है?

नहीं। Authorization को query उन रिकॉर्ड तक सीमित करनी चाहिए जिन्हें वर्तमान उपयोगकर्ता देख सकता है, जैसे authenticated account या tenant से filter करके।

स्रोत

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com MongoDB NoSQL Injection: सुरक्षित query filters Numeric ID में SQL Injection का जोखिम पैरामीटराइज़्ड क्वेरी क्या है? क्या Prisma $queryRaw SQL Injection से सुरक्षित है? क्या Rails where() में string interpolation सुरक्षित है? क्या Sequelize query() SQL Injection से सुरक्षित है?