flawopen.com/SQL injection/Stored procedures
क्या stored procedures SQL injection से सुरक्षित हैं?
नहीं — यह आम गलतफहमी है। Stored procedure तभी सुरक्षा देता है जब वह अंदर parameters bind करे। यदि वह अपने inputs को जोड़कर query string बनाता है और EXEC या sp_executesql से चलाता है, तो जोखिम application-level string concatenation जैसा ही है।
-- 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;
-- 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 parameters का समर्थन करता है: उन्हें declare करें और values अलग से दें (जैसे EXEC sp_executesql @sql, N'@id INT', @id = @UserId)। Values को @sql में न जोड़ें। Dynamic table या column names के लिए strict allowlist उपयोग करें, क्योंकि identifiers bind parameters नहीं होते।