Конфигурация оператора DELIMITER
является встроенной командой только в клиентском инструменте mysql. Вы не можете изменить разделитель для мульти-операторов . Это всегда точка с запятой.
Кроме того, MySQL API позволяет выполнять только один оператор за раз, по умолчанию. Пример, о котором вы говорите, не сработает, если вы явно не включите , включив несколько операторов .
Более того, мульти-операторы - не единственный вектор для внедрения SQL. Даже если бы вы могли изменить разделитель операторов, он ничего не сделал бы для защиты от внедрения SQL, который изменяет один данный оператор.
UPDATE Accounts SET PASSWORD = '...' WHERE account_id = $id
В этом примере, если $id
имеет значение "1234 OR 1=1
", злоумышленник изменил пароль для всех учетных записей, включая, вероятно, привилегированного пользователя. И все же никаких мульти-заявлений не было.
Вам по-прежнему нужно помнить о проблемах безопасности при написании кода. Нет серебряной пули для защиты от SQL-инъекций.
Даже параметры запроса не являются панацеей для внедрения SQL. Параметры заменяют только значения в выражениях SQL. Есть много распространенных случаев, когда все еще необходимо интерполировать переменные приложения в строку SQL. Например, при параметризации предиката IN()
или при выборе выражений ORDER BY
. Не слушайте людей, которые говорят, что подготовленные запросы на 100% защищены от недостатков безопасности.
См. Также мою презентацию Мифы и ошибки SQL-инъекций или главу по SQL-инъекциям в моей книге Антипаттерны SQL: предотвращение ошибок при программировании баз данных .