首页 > 解决方案 > 如何编写安全的存储过程

问题描述

我想编写一个安全的简单存储过程,它将根据给存储过程的一些参数从数据库表中选择一些列。

我尝试了两种编写存储过程的方法。

第一种方式:

CREATE PROCEDURE SPBasic
    @id int,
    @value int
AS
BEGIN
    SELECT Id, name, design 
    FROM SimpleTable
    WHERE ID = @id AND value = @value;
END
GO

第二种方式:

CREATE PROCEDURE SPBasic
    @id int,
    @value int
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'SELECT Id, name, design FROM SimpleTable
                 WHERE ID = @id AND value = @value';
    EXEC sp_executesql @sql, N'@id int, @value int', @id,@value;
END
GO

对于这两种情况,我将脚本运行为:

DECLARE @return_value int

EXEC    @return_value = SPBasic
        @id = N'11',
        @value = 1;drop table test

SELECT  'Return Value' = @return_value

在这两种情况下,我为测试目的创建的临时表测试都被删除了。

所以,我想知道为此目的的安全代码是什么?

标签: sql-serversql-injection

解决方案


由于您的两个存储过程都采用整数参数,因此不可能发生 SQL 注入攻击。如果第二个过程采用字符串 (varchar) 参数,则可能会发生 SQL 注入攻击。


推荐阅读