Я пишу функцию поиска и придумал этот запрос, используя параметры для предотвращения или, по крайней мере, ограничения атак с использованием SQL-инъекций. Однако когда я запускаю его через свою программу, он ничего не возвращает:
SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')
Можно ли так использовать параметры? или они действительны только в таком случае, как:
SELECT * FROM compliance_corner WHERE body LIKE '%<string>%' (где <string> - объект поиска).
Обновлено: я создаю эту функцию с помощью VB.NET, влияет ли это на синтаксис, который вы, ребята, внесли?
Кроме того, я запустил этот оператор в SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max% ') `, и он вернет результаты.





Возможно, вам придется объединить знаки% с вашим параметром, например:
НРАВИТСЯ '%' || @query || '%'
Редактировать: На самом деле, это может вообще не иметь никакого смысла. Думаю, я неправильно понял вашу проблему.
ты должен сделать:
LIKE '%' + @param + '%'
Ваш визуальный базовый код будет выглядеть примерно так:
Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")
cmd.Parameters.Add("@query", searchString)
Как указал Адам в своем ответе, это не защищает от SQL-инъекции. Запрос должен быть параметризован.
Не могли бы вы привести пример, в котором это не предотвращает SQL-инъекцию? Из моего тестирования он отлично работает
Он не открыт для инъекции SQL, только для инъекции LIKE. Это означает, что пользователь может вводить специальные символы, такие как %, ^ и _, которые LIKE интерпретирует особым образом. Это означает, что при определенных запросах пользователь может не получить то, что ожидает. Например, поиск 'less than 1% fat' может вернуть результат 'less than 1% of doctors recommend this - it's full of fat!'.
Я согласен, подобное подлежит «Инъекции лайка», и вред заключается только в том, что пользователь не получает того, чего ожидает. Обработка запросов должна выполняться всегда, даже если они параметризованы. Полагаться только на эту защиту не совсем безопасно.
@AlexHumphrey Я действительно посмеялся над этим примером, спасибо :)
Я также рекомендовал бы сделать searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]"), который позволит избежать инъекции LIKE (если вы не используете предложение escape).
Я бы пошел с:
Dim cmd as New SqlCommand(
"SELECT * FROM compliance_corner"_
+ " WHERE (body LIKE @query )"_
+ " OR (title LIKE @query)")
cmd.Parameters.Add("@query", "%" +searchString +"%")
Это правильно, принятый ответ, предоставленный Джоном, имеет неправильный синтаксис!
Я не уверен, что его синтаксис неверен, его решение сработало нормально. У меня есть функция, которая создает и возвращает оператор SQL для использования в таблице данных или в чем-то еще.
Дополнительное примечание: синтаксис для C# с использованием MySQLDataAdapter = da = new MySQLDataAdapter ("SELECT * FROM tableA WHERE fieldA = @fieldA"); da.SelectCommand.Parameters.AddWithValue ("@ fieldA", "%" + someValue + "%");
Другой ответ (от Джона) тоже работает, но действительно уязвим для подобной инъекции, которая МОЖЕТ дать странные результаты, в зависимости от цели вашего поля.
и намного лучше для памяти плана выполнения SQL Server
Разве cmd.Parameters.Add не должен превращаться в cmdLoad.Parameters.AddWithValue или есть какие-то проблемы? Я так понимаю, что ответ Джеймса с 2008 года :)
Иногда символ, используемый в качестве заполнителя %, не такой же, если вы выполняете запрос из VB, как когда вы выполняете его из MS SQL / Access. Попробуйте изменить символ-заполнитель с % на *. Это может сработать.
Однако, если вы отлаживаете и хотите скопировать строку SQL непосредственно в MS SQL или Access, чтобы проверить ее, вам, возможно, придется изменить символ обратно на % в MS SQL или Access, чтобы фактически вернуть значения.
Надеюсь это поможет
Я не знаю точно на 2012 год, но этот% vs * специфичен для движков ADO vs DAO. Если вы используете DAO или Current () в Access, подстановочный знак - *; при использовании ADO из любого кода, включая VBA внутри Access, подстановочный знак -%.
попробуйте также таким образом
Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%') OR title LIKE CONCAT('%',@query,'%') )")
cmd.Parameters.Add("@query", searchString)
cmd.ExecuteNonQuery()
Использовал Concat вместо +
отличное решение - по возможности поставил бы больше +1! Спасибо