PHP и дезинфицирующие строки для использования в динамически создаваемых запросах DB2

Я относительно новичок в DB2 для IBMi и мне интересно, как правильно очищать данные для динамически генерируемого запроса в PHP.

Например, если вы пишете класс PHP, который обрабатывает все взаимодействия с базой данных, нужно будет передать имена таблиц и тому подобное, некоторые из которых нельзя передать с помощью db2_bind_param(), Есть ли db2_prepare() очистить структурированный запрос самостоятельно? Или возможно, что неправильно сформированный запрос может быть «выполнен» в пределах db2_prepare() вызов? Я знаю, что есть db2_execute() но БД делает что-то в db2_prepare() и я не уверен, что (просто проверка синтаксиса?).

Я знаю, что если на передаваемые значения не влияет результат пользовательского ввода, проблем быть не должно, но если кто-то хочет очистить данные перед использованием их в запросе (без использования db2_prepare()/db2_execute()) что такое контрольный список для db2? Единственное, что я могу найти, это избежать одинарных кавычек, добавив к ним еще одну одинарную кавычку. Это действительно все, что нужно остерегаться?

1

Решение

При звонке не происходит волшебного «очищения» db2_prepare() — он просто попытается скомпилировать строку, которую вы передаете, как один оператор SQL. Если это недопустимый оператор DB2 SQL, будет возвращена ошибка. То же самое с db2_exec(), только это будет делать в один звонок, что db2_prepare() а также db2_execute() делать отдельно.

РЕДАКТИРОВАТЬ (для решения дальнейших вопросов от ОП).

Выполнение каждого оператора SQL имеет три этапа:

  1. Компиляция (или подготовка), когда оператор анализируется, синтаксически и семантически анализируется, определяются привилегии пользователя и создается план выполнения оператора.

  2. Привязка параметров — необязательный шаг, который необходим, только когда инструкция содержит маркеры параметров. На этом этапе каждый тип данных параметра проверяется на соответствие тому, что ожидает текст инструкции, на основе подготовки.

  3. Правильное выполнение, когда план запроса, сгенерированный на шаге 1, выполняется механизмом базы данных, опционально используя значения параметров (переменных), предоставленные на шаге 2. Результаты оператора, если таковые имеются, затем возвращаются клиенту.

db2_prepare(), db2_bind_param(), а также db2_execute() соответствуют шагам 1, 2 и 3 соответственно. db2_exec() объединяет шаги 1 и 3, пропуская шаг 2 и предполагая отсутствие маркеров параметров.

Теперь, говоря о безопасности параметров, шаг связывания гарантирует, что предоставленные значения параметров соответствуют ожидаемым ограничениям типа данных. Например, в запросе, содержащем что-то вроде ...WHERE MyIntCol = ?, если я попытаюсь связать символьное значение с этим параметром, это вызовет ошибку.

Если бы вместо этого я должен был использовать db2_exec() и составьте заявление так:

$stmt = "SELECT * FROM MyTab WHERE MyIntCol=" . $parm

Я мог бы легко передать что-то вроде "0 or 1=1" как значение $parm, которая выдаст совершенно правильный оператор SQL, который только тогда будет успешно проанализирован, подготовлен и выполнен db2_exec(),

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]