#sql #sql-server #where-clause #dynamic-sql #sql-like
#sql #sql-сервер #where-предложение #dynamic-sql #sql-подобный
Вопрос:
Я использую динамический SQL для создания инструкции SQL ‘SELECT’, которая будет выполнена. В инструкции SQL, которую я создаю, я хочу использовать оператор ‘LIKE’, но поскольку при этом используются кавычки «, он конфликтует с кавычками, используемыми в начале инструкции ‘SELECT’.
SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE ' @ApplicationName ' ;'
Предполагая, что ‘@ApplicationName = TestApp’, приведенная выше динамическая переменная SQL ‘@sql’ выдаст следующий оператор SQL:
SELECT * FROM LogTable WHERE Application LIKE TestApp ;
Это приведет к ошибке, поскольку кавычки не существуют вокруг ‘TestApp’. Как можно создать кавычки в динамическом SQL, позволяющие использовать оператор ‘LIKE’? Как можно создать приведенную ниже инструкцию SQL:
SELECT * FROM LogTable WHERE Application LIKE 'TestApp' ;
Комментарии:
1. Даже если у вас это получится, остерегайтесь маленьких таблиц Bobby. Если он когда-либо выполнит поиск
%TestApp%'; DROP TABLE LogTable; SELECT 'You were just SQL Inject Attacked
, вы можете получить «неожиданные результаты»! Ради всего святого, пожалуйста, не используйте эту структуру, используйте параметризованные запросы (они ЖЕ подготовленные операторы) .2. почему вы используете поиск like без подстановочных знаков? кроме того, если это что-то простое, как это, зачем вообще использовать динамический SQL?
3. Я намереваюсь реализовать приложение MVC, в котором должен быть выпадающий список с заранее определенными значениями. Выбор этих значений должен изменить @ApplicationName . Я намеревался использовать ‘LIKE’, чтобы при выборе пустого поля он заменял поисковый запрос оператора ‘LIKE’ на ‘%’, чтобы вывести все.
4. по-прежнему не объясняет, зачем вам нужен динамический sql
5. Вы создаете текст в приложении и передаете его в SQL? или вы строите на SQL? В любом случае, лучше заменить его хранимой процедурой SQL, которая принимает параметр, когда параметр равен null, возвращает все.
Ответ №1:
Я буду использовать SP_EXECUTESQL
там, где вы не хотите беспокоиться об одинарных кавычках
Declare @sql NVARCHAR(max)
SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE @ApplicationName ;'
EXEC Sp_executesql
@sql,
N'@ApplicationName varchar(100)',
@ApplicationName = @ApplicationName
Также это позволяет избежать внедрения SQL
Комментарии:
1. Кроме того, вам не нужно беспокоиться о атаках с использованием SQL-инъекций. Всегда, просто всегда, используйте параметризованные запросы, подобные этому 🙂
2. и вам не нужно беспокоиться, если кто-то ищет что-то с a
'
в нем3.Это то же самое, что и я. Если строковый литерал содержит a
'
, то ваш подготовленный оператор отлично справится с этим, но структура OP потерпит неудачу из-за того, что SQL имеет что-то вродеLIKE 'Fred's App'
(середина'
приводит к завершению строки иs App'
является синтаксической ошибкой).
Ответ №2:
Вам нужно добавить кавычки в SQL самостоятельно. Вы можете избежать одинарной кавычки, используя две из них:
SET @sql =
'SELECT * FROM LogTable WHERE Application LIKE ''' @ApplicationName ''';'
Комментарии:
1. Вы только что помогли кому-то открыть свой код для атак с использованием SQL-инъекций.