使用Like运算符在使用Like运算符的SQL查询中避免SQL注入?

时间:2008-10-23 03:46:20

标签: search ado.net sql-injection sql-like

接管我前任的一些代码,我找到了一个使用Like运算符的查询:

SELECT * FROM供应商 供应商名称如'%'+名称+%';

尝试避免SQL注入问题并对此进行参数化,但我不确定如何实现。有什么建议吗?

请注意,我需要一个经典ADO.NET的解决方案 - 我真的不需要将这些代码转换为类似LINQ的东西。

4 个答案:

答案 0 :(得分:18)

试试这个:

var query = "select * from foo where name like @searchterm";
using (var command = new SqlCommand(query, connection))
{
  command.Parameters.AddWithValue("@searchterm", String.Format("%{0}%", searchTerm));
  var result = command.ExecuteReader();
}

框架将自动处理引用问题。

答案 1 :(得分:8)

只需参数化您的查询:

SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%'

现在您可以将“name”变量传递给@name参数,查询将在没有任何注入攻击危险的情况下执行。即使你传递的内容如“'或'真 - ”它仍然可以正常工作。

答案 2 :(得分:0)

在Entity Framework 6中,Native SQL可以这样做:

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person]
       WHERE [FirstName] LIKE N'%' + @p0 + '%' ", "ab").ToList();

或者

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person]
       WHERE [FirstName] LIKE N'%' + @name + '%' ",
    new SqlParameter("@name", "ab")).ToList();

此外,您可以直接使用LINQ to Entities:

List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList();

答案 3 :(得分:-5)

Short Anwser:

1)name.Replace(“'”,“''”)....替换数据库可能具有的任何转义字符(单引号是最常见的)

2)如果你使用像.net这样的语言使用参数化查询

sql="Insert into Employees (Firstname, Lastname, City, State, Zip, Phone, Email) Values ('" & frmFirstname.text & "', '" & frmLastName & "', '" & frmCity & "', '" & frmState & "', '" & frmZip & "', '" & frmPhone & "', '" & frmEmail & "')"

以上

取代上述内容
Dim MySQL as string = "Insert into NewEmp (fname, LName, Address, City, State, Postalcode, Phone, Email) Values (@Firstname, @LastName, @Address, @City, @State, @Postalcode, @Phone, @Email)" 

With cmd.Parameters:
    .Add(New SQLParameter("@Firstname", frmFname.text))
    .Add(New SQLParameter("@LastName", frmLname.text))
    .Add(New SQLParameter("@Address", frmAddress.text))
    .Add(New SQLParameter("@City", frmCity.text))
    .Add(New SQLParameter("@state", frmState.text))
    .Add(New SQLParameter("@Postalcode", frmPostalCode.Text))
    .Add(New SQLParameter("@Phone", frmPhone.text))
    .Add(New SQLParameter("@email", frmemail.text))
end with

3)用户存储过程

4)如果您使用.net

,请再次使用Linq to SQL