面试题答案
一键面试防止SQL注入漏洞的常用方法
- 参数化查询:使用参数化查询,将数据和SQL命令分离,避免用户输入的数据直接嵌入SQL语句中。这样数据库引擎会将参数视为常量,而不是可执行的SQL代码。
- 存储过程:存储过程在数据库中预编译并存储,使用参数化输入。调用存储过程时,传递的参数会被正确处理,降低SQL注入风险。
- 输入验证:对用户输入的数据进行严格验证,确保其符合预期的格式和范围。例如,对于数值类型的输入,验证其是否为有效的数字;对于字符串输入,限制其长度等。
- 使用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注入。