Как избежать внедрения SQL в запросе SQL с оператором Like с использованием параметров?

Взяв на себя некоторый код от моего предшественника, я нашел запрос, в котором используется оператор Like:

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

Пытаюсь избежать проблемы с SQL-инъекцией и параметризовать это, но я не совсем уверен, как это можно сделать. Какие-либо предложения ?

обратите внимание, мне нужно решение для классической ADO.NET - у меня действительно нет доброй воли, чтобы переключить этот код на что-то вроде LINQ.


person MikeJ    schedule 23.10.2008    source источник


Ответы (4)


попробуй это:

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();
}

фреймворк автоматически решит вопросы цитирования.

person craigb    schedule 23.10.2008
comment
Спасибо! Приятно получить в ответ рабочий фрагмент кода. Я застревал на {0} в тексте запроса. - person MikeJ; 23.10.2008

Просто параметризуйте свой запрос:

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

Теперь вы можете передать свою переменную «name» в параметр @name, и запрос будет выполнен без какой-либо опасности инъекционных атак. Даже если вы введете что-то вроде «ИЛИ истина -», он все равно будет работать нормально.

person Matt Hamilton    schedule 23.10.2008

В Entity Framework 6 это можно сделать с помощью собственного SQL:

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

Or

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();
person Recev Yildiz    schedule 16.11.2017

Краткий ответ:

1) name.Replace ("'", "' '") .... Замените все escape-символы, которые могут быть в вашей базе данных (наиболее распространены одинарные кавычки)

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) используйте Linq to SQL, опять же, если вы используете .net

person vdhant    schedule 23.10.2008
comment
Я не понимаю, почему здесь все голоса против ... Я показал диапазон вариантов и то, что было доступно. Лично я бы не стал использовать вариант 1, но я сказал, что нужно экранировать все символы, а не только одинарные кавычки. Если это сделано, это совершенно верно. Варианты только улучшаются. Люди не должны голосовать против, не объясняя почему. - person vdhant; 29.03.2010
comment
vdhant, вы не ответили на вопрос. Первоначальный вопрос был сосредоточен на том, как использовать параметризованные запросы с оператором Like, и вы вообще не упоминаете оператор Like в своем ответе. - person CodeThug; 10.05.2011