存储过程的SQL注入攻击

时间:2019-03-29 17:25:08

标签: sql sql-server sql-injection

我的存储过程如下:

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注入攻击。

3 个答案:

答案 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'