我有一个使用常规参数化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);
}
}
答案 0 :(得分:1)
您需要使用参数而不是字符串连接。在这种情况下,您将是安全的
答案 1 :(得分:0)
不,它没有。只要通过将字符串连接在一起构造SQL语句,就会面临SQL注入的风险。
例如:
"Exec insertTags @name='" + name
有人可以通过:“任何事情”; DROP TABLE xxx;“对于名称,可能会破坏您的数据库。您仍然可以对存储过程使用参数化查询,因此它们可以提供相同的保护,而不是像您在示例中调用它一样。
答案 2 :(得分:0)
即使在使用存储过程时,在应用程序中使用字符串连接也会使该代码的执行容易受到SQL注入的攻击。</ p>
在ADO.NET中,执行存储过程的正确方法是使用DbCommand
类,CommandType
设置为CommandType.StoredProcedure
并在{{Parameters
中提供存储过程参数1}}集合。
MSDN链接:System.Data.Common.DbCommand