存储过程是否不受 SQL 注入的影响

本文关键字:注入 影响 SQL 是否 存储过程 | 更新日期: 2023-09-27 18:36:38

我有一个使用普通参数化SQL查询将记录插入数据库的方法。

public static void Add(string name, string friendlyName)
    {
    using (var db = Database.Open(_connectionString))
    {
        var sql = "INSERT INTO Tags(Name, UrlFriendlyName) " +
            "VALUES(@0,@1)";
            db.Execute(sql, name, friendlyName);
    }
}

我更改了方法,使其改用存储过程

public static void Add(string name, string friendlyName)
{
    using (var db = Database.Open(_connectionString))
    {
        // USE STORED PROCEDURE
        var query = "Exec insertTags @name='" + name + "', @urlFriendlyName= '" + friendlyName + "'";
        db.Execute(query);
    }
}

存储过程如下所示

CREATE PROCEDURE insertTags
@name nvarchar(25),
@urlFriendlyName nvarchar(25)
AS
BEGIN
BEGIN Transaction
BEGIN TRY
INSERT INTO dbo.Tags(Name, UrlFriendlyName) 
VALUES(@name, @urlFriendlyName)
IF @@TRANCOUNT > 0
BEGIN COMMIT TRANSACTION;
END
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN ROLLBACK TRANSACTION;
END
END CATCH
END

这两种方法都很好用。我的问题是,利用存储过程的方法是否像第一个方法那样提供针对SQL注入的安全性?谢谢。

编辑

我将第二种方法更改为使用参数而不是字符串连接,并且它有效。这对 SQL 注入安全吗?

public static void Add(string name, string friendlyName)
{
    using (var db = Database.Open(_connectionString))
    {
        // USE STORED PROCEDURE
        var query = "Exec insertTags @0, @1";
        db.Execute(query, name, friendlyName);
    }
}

存储过程是否不受 SQL 注入的影响

您需要使用参数而不是字符串连接。在这种情况下,您将是安全的

不,它没有。一旦通过将字符串连接在一起来构造 SQL 语句,就会面临 SQL 注入的风险。

例如:

"Exec insertTags @name='" + name

有人可以通过:"任何东西";删除表 xxx;" 作为名称,并可能破坏您的数据库。您仍然可以对存储过程使用参数化查询,以便它们可以提供相同的保护,只是不是以您在示例中调用它的方式。

即使在使用存储过程时,在应用程序中使用字符串串联也会自动使该代码的执行容易受到 SQL 注入的影响。

在 ADO.NET 中,执行存储过程的正确方法是使用CommandType设置为 CommandType.StoredProcedureDbCommand 类,并在 Parameters 集合中提供存储过程参数。

链接到 MSDN: System.Data.Common.DbCommand