MST
星途 面试题库

面试题:C#中防止SQL注入漏洞的常用方法

在C#开发中,经常会涉及到数据库操作,而SQL注入是一种常见且危险的漏洞。请阐述在C#里防止SQL注入漏洞的常用方法,并举例说明如何使用参数化查询来实现安全的数据库交互。
27.2万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

防止SQL注入漏洞的常用方法

  1. 参数化查询:使用参数化查询,将数据和SQL命令分离,避免用户输入的数据直接嵌入SQL语句中。这样数据库引擎会将参数视为常量,而不是可执行的SQL代码。
  2. 存储过程:存储过程在数据库中预编译并存储,使用参数化输入。调用存储过程时,传递的参数会被正确处理,降低SQL注入风险。
  3. 输入验证:对用户输入的数据进行严格验证,确保其符合预期的格式和范围。例如,对于数值类型的输入,验证其是否为有效的数字;对于字符串输入,限制其长度等。
  4. 使用ORM(对象关系映射)框架:如Entity Framework,它提供了高层次的数据访问抽象,在底层使用参数化查询等机制来防止SQL注入。

参数化查询示例

以下是使用SqlCommand进行参数化查询的示例:

using System;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=YOUR_USERNAME;Password=YOUR_PASSWORD";
        string username = "testUser"; // 假设这是用户输入的用户名
        string password = "testPassword"; // 假设这是用户输入的密码

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            string query = "SELECT * FROM Users WHERE Username = @Username AND Password = @Password";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@Username", username);
                command.Parameters.AddWithValue("@Password", password);

                try
                {
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            Console.WriteLine("用户存在");
                        }
                        else
                        {
                            Console.WriteLine("用户不存在");
                        }
                    }
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("数据库操作出错: " + ex.Message);
                }
            }
        }
    }
}

在上述示例中,@Username@Password是参数占位符,通过command.Parameters.AddWithValue方法将实际值赋给参数,这样就避免了用户输入的数据直接嵌入SQL语句,有效防止了SQL注入。