Как вы анализируете его и что вы делаете с результатами?
Если вы пишете код, который строит оператор SQL, вы уязвимы для внедрения SQL.
Как будто вы пишете:
set @myquery = 'select customer_name from customer where customer_id = ''' + @custid + ''''
execute (@myquery)
И предположим, что вы в конечном итоге получаете @custid из пользовательского ввода, скажем, текстовое поле в форме.
Если пользователь вводит
42
, тозапрос становится
select customer_name from customer where customer_id = '42'
Круто.Предположительно, это именно то, что вы и хотели.
Но предположим, что пользователь вводит
42'; update customer set balance_due = 0 where customer_id = '42
Теперь ваш запрос становится
select customer_name from customer where customer_id = '42'; update customer set balance_due = 0 where customer_id = '42'
, и клиент только что обнулил свой баланс из-за этого.Или он может удалить целые таблицы и т. Д.
Мораль этой истории в том, что НИКОГДА никогда не создавайте SQL-запрос динамически с использованием пользовательских данных.Это дает пользователям возможность делать с базой данных все, что они хотят.
Правильный способ сделать это:
select customer_name from customer where customer_id = @custid
Тогда, если пользователь пытается использовать SQL-инъекцию, он просто создаетне найден в записи, потому что введенная ими строка SQL не является действительным идентификатором клиента.(Или, если вы не выполняете какую-либо проверку типов, они могут получить ошибку преобразования данных. Это тоже плохо, и вы должны предотвратить это, но не так плохо, как внедрение SQL.)
Избегайте динамического построения операторов SQL,Когда это возможно, передавайте значения в качестве параметров.
Хорошо, иногда вам просто нужно динамически строить операторы.Наиболее распространенным случаем, о котором я могу думать, является экран критериев выбора, где пользователь может ввести значения для 10 различных критериев - дата в этом диапазоне, имя содержит это, сумма меньше этого и т. Д. - но каждое условие является необязательным,и если пользователь не вводит значение, то вы не хотите, чтобы этот тест был частью запроса.Таким образом, существуют миллионы возможных комбинаций, и вы хотите собрать запрос на лету.Это нормально, но НЕ вставляйте значения при построении запроса на лету.Вставьте параметры, а затем установите параметры.
Если значения генерируются в программе, а не из пользовательского ввода, и вы абсолютно уверены, что эти значения никогда не будут содержать текст SQL-инъекции, тогда безопасно встраивать значения вваш SQL.Единственный раз, когда я делаю это, это когда я фиксирую жестко закодированные значения.Например, если бы я мог создать код, который говорит «где тип = 1», или он мог бы сказать «где тип = 2», а цифры 1 и 2 жестко запрограммированы в программе, а не как ввод пользователя.Если сомневаетесь, создайте параметры.