FlawOpen

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 बनती है
// Interpolation पहले string में evaluate होती है।
var sql = $"SELECT * FROM Users WHERE Id = {id}";

// FromSqlRaw को SQL text मिलता है, FormattableString नहीं।
var query = context.Users.FromSqlRaw(sql);
सुरक्षित — values पैरामीटर बनी रहती हैं
// 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 करा सकता है।

Codebase की जाँच कैसे करें

rg -n -g '*.cs' '(FromSqlRaw|FromSqlInterpolated|FromSql)\s*\(' .
हर call में overload और argument type जाँचें। Untrusted data को जोड़ने, FromSqlRaw में interpolation देने या FormattableString को string बनाने के लिए trace करें; dynamic identifier अलग से जाँचें।

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

क्या parameters मिलने पर FromSqlRaw सुरक्षित है?

हाँ, यदि SQL में placeholders हों और values अलग arguments में दी जाएँ, जैसे FromSqlRaw("... {0}", value)। Value को पहले SQL string में न जोड़ें या interpolate करें।

C# interpolated string के साथ FromSqlInterpolated सुरक्षित क्यों है?

यह FormattableString लेता है, जो format और values अलग रखता है। EF Core हर value को database parameter में बदलता है। पहले string में रखने या FromSqlRaw को देने से यह सुरक्षा खो जाती है।

क्या parameters table या column names बदल सकते हैं?

नहीं। Parameters केवल values दर्शाते हैं। Dynamic identifier के लिए user विकल्पों को ज्ञात नामों की fixed allow-list से map करें और authorization तथा query cost जाँचें।

स्रोत और संदर्भ

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com FastAPI SQL इंजेक्शन: Pydantic क्या रोकता है और क्या नहीं GORM Raw SQL: Go में SQL injection रोकें क्या Quotes Escape करना SQL Injection रोकने के लिए काफ़ी है? SQL इंजेक्शन रोकने के लिए ORM का उपयोग काफ़ी है? क्या Knex.js SQL Injection से सुरक्षित है? MyBatis ${} बनाम #{}: SQL Injection से बचाव