SQL存储过程是否可以安全存储过程?

时间:2015-01-08 09:14:16

标签: c# sql-server stored-procedures

我有一个使用常规参数化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);

    }
}

3 个答案:

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