Как избежать SQL-инъекций в SQL-запросах с помощью Like-оператора, используя параметры? - PullRequest
13 голосов
/ 23 октября 2008

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

ВЫБРАТЬ * ОТ ПОСТАВЩИКОВ ГДЕ имя_поставщика наподобие '%' + имя +% ';

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

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

Ответы [ 4 ]

18 голосов
/ 23 октября 2008

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

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

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

8 голосов
/ 23 октября 2008

Просто настройте параметры вашего запроса:

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

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

0 голосов
/ 16 ноября 2017

В 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();
0 голосов
/ 23 октября 2008

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

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) сохраненные пользователем procs

4) используйте Linq to SQL, опять же, если вы используете .net

...