SQL CLR存储过程是否会阻止注入?

时间:2013-04-22 05:16:26

标签: c# sql-injection clrstoredprocedure

我已经用C#编写了一个CLR存储过程

[Microsoft.SqlServer.Server.SqlProcedure]
public static void IsUserNameExists(string strUserName, out SqlBoolean returnValue)
{      
    using (SqlConnection connection = new SqlConnection("context connection=true"))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("Select count(UserName) from [User] where UserName='" + strUserName + "'", connection);

        int nHowMany = int.Parse(command.ExecuteScalar().ToString());

        if (nHowMany > 0)
            returnValue = true;
        else
            returnValue = false;
    }
}

是否容易受到SQL注入攻击?我正在使用SqlParameter。任何最佳做法?

3 个答案:

答案 0 :(得分:3)

防止sql注入的唯一正确方法应该是使用参数化查询。 你正在做的事情并不安全,因为你正在连接字符串。

请在此处查看此参考资料How do parameterized queries help against SQL injection?

为了清楚起见,为什么您的代码容易受到攻击:
SQLParameter而言,即使'); DROP TABLE YourTable;--之类的内容也是有效的输入(因为它是一个字符串)。然后,您将使用它来创建内部查询,这是您的SQL注入。

答案 1 :(得分:1)

  

是否容易受到SQL注入攻击?

是:

SomeType.IsUserNameExists("'; insert into [User](UserName) values ('Malefactor_Username'); select '1", out returnValue);
  

任何最佳做法?

始终使用参数化查询。

答案 2 :(得分:0)

CLR存储过程默认情况下不会阻止此操作。你需要自己这样做,因为CLR不会自动执行此操作(我想这是你想知道的实际问题)

只需像这样更新你的代码,你应该都很好。

 [Microsoft.SqlServer.Server.SqlProcedure]
    public static void IsUserNameExists(string strUserName, out SqlBoolean returnValue)
    {
        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            SqlCommand command = new SqlCommand("Select count(UserName) from [User] where UserName=@UserName", connection);
            command.Parameters.Add(new SqlParameter("@UserName", strUserName));

            int nHowMany = int.Parse(command.ExecuteScalar().ToString());

            if (nHowMany > 0)
                returnValue = true;
            else
                returnValue = false;
        }
    }