flawopen.com/C# में SQL Injection/EF Core FromSqlRaw
क्या Entity Framework Core का FromSqlRaw सुरक्षित है?
हाँ, यदि values SQL text से अलग रहें। FromSqlRaw raw SQL स्वीकार करता है; अविश्वसनीय input को string में जोड़ने या interpolate करने से query बदल सकती है। अलग parameter arguments दें या interpolated FormattableString को FromSqlInterpolated (EF Core 7+ में FromSql) को दें। Parameter को सीलबंद value-slot समझें: database को value मिलती है, नया SQL निर्देश नहीं।
// Interpolation पहले string में evaluate होती है। var sql = $"SELECT * FROM Users WHERE Id = {id}"; // FromSqlRaw को SQL text मिलता है, FormattableString नहीं। var query = context.Users.FromSqlRaw(sql);
// EF Core 3–6: positional placeholder और अलग value। var byRawParameter = context.Users.FromSqlRaw( "SELECT * FROM Users WHERE Id = {0}", id); // EF Core 3+: interpolation को parameter API में दें। var byInterpolation = context.Users.FromSqlInterpolated( $"SELECT * FROM Users WHERE Id = {id}"); // EF Core 7+: FromSql भी FormattableString लेता है। var byFromSql = context.Users.FromSql( $"SELECT * FROM Users WHERE Id = {id}");
ध्यान देने योग्य बारीकी
FromSqlInterpolated को FormattableString मिलता है। EF Core उसका format और arguments पढ़कर हर interpolated value को अलग database parameter के रूप में भेजता है; यह compile-time interception नहीं है। EF Core 7 में समान सुरक्षित व्यवहार वाला FromSql जोड़ा गया। पुराने संस्करणों में FromSqlInterpolated उपयोग करें। FromSqlRaw भी सुरक्षित है, यदि {0} जैसे placeholder के लिए value अलग argument में दी जाए। यदि interpolated string को पहले string में रख दिया, तो parameter metadata खो चुका होता है।
पैरामीटर values बाँधते हैं, column names नहीं
Database parameter value दर्शाता है, table या column name, SQL operator या sort direction नहीं। Query की संरचना बदलनी हो, तो application code में fixed allow-list से identifier चुनें; identifier को parameterize करने की कोशिश न करें और character filtering को allow-list का विकल्प न मानें। Authorization और query cost भी जाँचें: वैध column भी संवेदनशील data उजागर कर सकता है या महँगा scan करा सकता है।
- ✓Values के लिए सीधे interpolated FromSqlInterpolated/FromSql या अलग parameters वाला FromSqlRaw उपयोग करें।
- ✓जोड़कर या interpolate किया user data कभी FromSqlRaw को न दें। FormattableString को पहले string में न बदलें।
- ✓Dynamic identifier केवल fixed allow-list से चुनें। चुने field की अनुमति और efficient index अलग-अलग जाँचें।
- ✓यदि LINQ query को स्पष्ट रूप से व्यक्त कर सके तो उसे प्राथमिकता दें; parameterization SQL syntax injection रोकती है, authorization या business rules लागू नहीं करती।
Codebase की जाँच कैसे करें
rg -n -g '*.cs' '(FromSqlRaw|FromSqlInterpolated|FromSql)\s*\(' .अक्सर पूछे जाने वाले प्रश्न
हाँ, यदि SQL में placeholders हों और values अलग arguments में दी जाएँ, जैसे FromSqlRaw("... {0}", value)। Value को पहले SQL string में न जोड़ें या interpolate करें।
यह FormattableString लेता है, जो format और values अलग रखता है। EF Core हर value को database parameter में बदलता है। पहले string में रखने या FromSqlRaw को देने से यह सुरक्षा खो जाती है।
नहीं। Parameters केवल values दर्शाते हैं। Dynamic identifier के लिए user विकल्पों को ज्ञात नामों की fixed allow-list से map करें और authorization तथा query cost जाँचें।
स्रोत और संदर्भ
- Microsoft Learn — EF Core SQL queries और parameters
- Microsoft Learn — FromSqlRaw API
- Microsoft Learn — FromSqlInterpolated API
- OWASP — SQL Injection रोकथाम गाइड
- FlawOpen — C# में SQL Injection