FlawOpen

flawopen.com/SQL injection/Stored procedures

क्या stored procedures SQL injection से सुरक्षित हैं?

संदर्भ पृष्ठ
संक्षिप्त उत्तर

नहीं — यह आम गलतफहमी है। Stored procedure तभी सुरक्षा देता है जब वह अंदर parameters bind करे। यदि वह अपने inputs को जोड़कर query string बनाता है और EXEC या sp_executesql से चलाता है, तो जोखिम application-level string concatenation जैसा ही है।

असुरक्षित — dynamic SQL में मान जोड़ें
-- SQL Server T-SQL; dbo.Users.Id is NVARCHAR(50).
CREATE PROCEDURE dbo.GetUser
  @UserId NVARCHAR(50)
AS
BEGIN
  DECLARE @sql NVARCHAR(MAX) =
    N'SELECT Id FROM dbo.Users WHERE Id = N'''
      + @UserId + N'''';
  EXEC(@sql);
END;
सुरक्षित — sp_executesql से parameter bind करें
-- SQL Server T-SQL; same illustrative schema.
CREATE PROCEDURE dbo.GetUser
  @UserId NVARCHAR(50)
AS
BEGIN
  DECLARE @sql NVARCHAR(MAX) =
    N'SELECT Id FROM dbo.Users WHERE Id = @id';
  EXEC sys.sp_executesql
    @stmt = @sql,
    @params = N'@id NVARCHAR(50)',
    @id = @UserId;
END;

यह गलत धारणा आम क्यों है

“Stored procedures का उपयोग करें” को अक्सर SQL injection का सार्वभौमिक समाधान कहा जाता है। यह तभी सही है जब procedure सामान्य query में values को bound parameters की तरह दे। यदि वह EXEC से dynamic SQL बनाकर अविश्वसनीय values जोड़ता है, तो वही जोखिम लौट आता है। Dynamic SQL आवश्यक हो तो sp_executesql से values bind करें। Table या column names को values की तरह bind नहीं किया जा सकता; अनुमत विकल्पों को strict allowlist से fixed identifiers में map करें।

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

क्या sp_executesql सुरक्षित हो सकता है?

हाँ। sp_executesql parameters का समर्थन करता है: उन्हें declare करें और values अलग से दें (जैसे EXEC sp_executesql @sql, N'@id INT', @id = @UserId)। Values को @sql में न जोड़ें। Dynamic table या column names के लिए strict allowlist उपयोग करें, क्योंकि identifiers bind parameters नहीं होते।

संदर्भ

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com क्या TypeORM QueryBuilder SQL Injection से सुरक्षित है? Django ORM और SQL Injection: सुरक्षित तरीके Doctrine ORM में SQL Injection: सुरक्षित queries EF Core FromSqlRaw: सुरक्षित पैरामीटरयुक्त SQL FastAPI SQL इंजेक्शन: Pydantic क्या रोकता है और क्या नहीं GORM Raw SQL: Go में SQL injection रोकें