C#避免在函数中使用SQL注入

时间:2015-03-10 23:07:57

标签: c# sql sql-server sql-injection

我想创建一个帮助SQL服务器数据库中的SELECT,INSERT,UPDATE和DELETE的类,但我通过搜索发现存在“sql注入”,并且避免它的方法是使用类似于以下:

private static void Select() {
    string cmdStr = "SELECT FirstName, LastName, Telephone FROM Person WHERE FirstName = @FirstName";
    using (SqlConnection connection = new SqlConnection(ConnectionString))
    using (SqlCommand command = new SqlCommand(cmdStr, connection)) {
        command.Parameters.AddWithValue("@FirstName", "John");
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read()) {
            string output = "First Name: {0} \t Last Name: {1} \t Phone: {2}";
            Console.WriteLine(output, reader["FirstName"], reader["LastName"], reader["Telephone"]);
        }
    }
}

以下函数可以进行sql注入吗?

  private static void SelectWithWhere(String query, String[] parameters)
        {

            {
                string cmdStr = "SELECT FirstName, LastName, Telephone FROM Person WHERE "+parameters[0];
                using (SqlConnection connection = new SqlConnection(ConnectionString))
                using (SqlCommand command = new SqlCommand(cmdStr, connection))
                {
                    command.Parameters.AddWithValue("@FirstName", parameters[0]);
                    connection.Open();
                    SqlDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        string output = "First Name: {0} \t Last Name: {1} \t Phone: {2}";
                        Console.WriteLine(output, reader["FirstName"], reader["LastName"], reader["Telephone"]);
                    }
                }
            }
        }

3 个答案:

答案 0 :(得分:3)

只要您使用SqlParameter将用户输入添加到查询中,就可以安全地使用Sql Injection。

如果您使用字符串连接,则需要解析用户输入以确保您不会发出恶意查询。

老实说,在这个问题的范围之外,现在已经过时了直接编写Ado.Net代码。有大量的微观元素可以让您的生活轻松起来。

答案 1 :(得分:3)

每次使用用户提供的输入生成SQL语句时,都会打开SQL注入的大门。避免sql注入的唯一方法是使用参数。

第一个函数是安全的,但如果你不控制提供的String[] parameters,第二个函数可能容易受到sql注入攻击。如果用户(直接或间接)提供此数组的值,他可以传递一个sql语句,它自己基本​​上执行他想要的任何数据库。

答案 2 :(得分:1)

上面的函数没有,因为您将值传递为SqlArgument。而不是作为SQL的一部分。第二种方法,是的,如果参数包含这样的内容:

parameters = new [] { "1<>1;DROP TABLE PERSON;" }

要执行的查询最终会成为:

"SELECT FirstName, LastName, Telephone FROM Person WHERE 1<>1;DROP TABLE PERSON;"

哪个SQL Server将执行第一个语句(SELECT),然后执行第二个语句DROP