我想创建一个帮助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"]);
}
}
}
}
答案 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