存储过程是否不受 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 注入的风险。
例如:
"Exec insertTags @name='" + name
有人可以通过:"任何东西";删除表 xxx;" 作为名称,并可能破坏您的数据库。您仍然可以对存储过程使用参数化查询,以便它们可以提供相同的保护,只是不是以您在示例中调用它的方式。
即使在使用存储过程时,在应用程序中使用字符串串联也会自动使该代码的执行容易受到 SQL 注入的影响。
在 ADO.NET 中,执行存储过程的正确方法是使用CommandType
设置为 CommandType.StoredProcedure
的 DbCommand
类,并在 Parameters
集合中提供存储过程参数。
链接到 MSDN: System.Data.Common.DbCommand