我的存储过程如下:
CREATE PROCEDURE sp_GetName(@Name NVARCHAR(50))
AS
BEGIN
DECLARE @sqlcmd NVARCHAR(MAX);
DECLARE @params NVARCHAR(MAX);
SET @sqlcmd = N'SELECT * FROM [dbo].[Employee] WHERE Name like ''%' + @Name + '%''';
PRINT @sqlcmd;
SET @params = N'@Name NVARCHAR(50)';
EXECUTE sp_executesql @sqlcmd, @params, @Name;
END
EXEC sp_GetName '';WAITFOR DELAY '00:00:10'
每当我执行上述语句时,它总是会延迟响应。
如何编写我的过程,以便它可以处理此SQL注入攻击。
答案 0 :(得分:2)
如果要避免SQL注入攻击,请不要使用动态SQL。是否将字符串连接代码包装在存储过程中都没有关系。
在这种情况下,没有理由使用动态SQL。您可以简单地写:
SELECT * FROM [dbo].[Employee] WHERE Name like '%' + @Name + '%'
搜索名称中具有特定字符串的员工。
无论您从客户端还是作为存储过程将其作为参数化查询执行,此查询都不受SQL注入的影响。客户会以相同的方式呼叫他们两个。
存储过程应为:
CREATE PROCEDURE getName(@Name nvarchar(50)
AS
SELECT * FROM [dbo].[Employee] WHERE Name like '%' + @Name + '%'
我删除了sp_
前缀,因为它用于系统存储过程。
此代码的问题是%something%
必须搜索整个表。它不能使用Name
上的任何索引。只有前缀搜索可以使用索引,即@Name + '%'
:
SELECT * FROM [dbo].[Employee] WHERE Name like @Name + '%'
答案 1 :(得分:0)
您只需要对动态代码进行参数化。
CREATE PROCEDURE sp_GetName(@Name NVARCHAR(50))
AS
BEGIN
DECLARE @sqlcmd NVARCHAR(MAX);
DECLARE @params NVARCHAR(MAX);
SET @sqlcmd = N'SELECT * FROM [dbo].[Employee] WHERE Name like ''%'' + @Name + ''%''';
print @sqlcmd;
SET @params = N'@Name NVARCHAR(50)';
EXECUTE sp_executesql @sqlcmd, @params, @Name;
End
exec sp_GetName '';
但是,该代码没有任何东西可以证明需要使其具有动态性。可以这样简单地重写。
CREATE PROCEDURE sp_GetName(@Name NVARCHAR(50))
AS
SELECT * FROM [dbo].[Employee] WHERE Name like '%' + @Name + '%';
为什么要设计使应用程序变慢?
答案 2 :(得分:0)
您可以仅在存储过程中嵌入SQL,而无需使用sp_executesql
CREATE PROCEDURE sp_GetName(@Name NVARCHAR(50))
AS
BEGIN
SELECT * FROM [dbo].[Employee] WHERE Name like '%' + @Name + '%'
End
您的示例实际上并未演示SQL注入攻击;它只是示例。您只有2条用分号分隔的sql语句,其中第二条是“ wait”
-- Also demonstrates wait behaviour
exec sp_who;WAITFOR DELAY '00:00:10'