Как избежать SQL-инъекции в SQL-запросе с помощью оператора Like с использованием параметров?
-
04-07-2019 - |
Вопрос
Переняв код от своего предшественника, я нашел запрос, в котором используется оператор Like:
Выберите * от поставщиков, где поставщик_name нравится '%'+name+%';
Пытаюсь избежать проблемы SQL-инъекции и параметризовать ее, но я не совсем уверен, как это можно сделать.Какие-либо предложения ?
обратите внимание, мне нужно решение для классического ADO.NET - у меня нет разрешения переключить этот код на что-то вроде LINQ.
Решение
попробуйте это
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();
}
фреймворк автоматически решит проблемы с цитированием.
Другие советы
Просто параметризуйте свой запрос:
SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%'
Теперь вы можете передать переменную «name» в параметр @name, и запрос будет выполнен без какой-либо опасности внедрения атак.Даже если вы передадите что-то вроде «'' OR true --», это все равно будет работать нормально.
В 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();
Короткий ответ:
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