Единственная защита MySQL от случая, который вы демонстрируете, заключается в том, что по умолчанию интерфейс запросов MySQL не выполняет несколько операторов.Разделение операторов по ;
приведет только к синтаксической ошибке.
Однако, мультизапрос - это опция, и в зависимости от клиента эта опция может быть включена.
PDO разрешаетмультизапрос по умолчанию.Я могу запустить следующее, и он вставит две строки:
$pdo->query("insert into foo set id = 1; insert into foo set id = 2");
Однако, если вы попытаетесь использовать подготовленные операторы (отключение эмулированной подготовки), произойдет сбой:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare("insert into foo set id = ?; insert into foo set id = ?");
Это выбрасываетисключение, если вы включили исключения:
Неустранимая ошибка PHP: Uncaught PDOException: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL имеется ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с «вставить в foo set id =?»в строке 1
Mysqli включает мультизапрос только для запросов, которые вы выполняете с помощью функции mysqli_multi_query () .Поэтому, если вы не используете multi_query () в своем коде, вы в безопасности.
Кроме того, если вы используете параметры запроса (я видел ваш комментарий, что вы используете параметры запроса), вы такжебезопасно, потому что даже если параметр будет содержать любую попытку обмануть запрос, он не будет работать.
Параметры не просто объединяются в запрос SQL, когда вы используете подготовленные операторы.Это ошибочное мнение многих разработчиков.
Параметры хранятся отдельно от синтаксиса SQL до после синтаксического анализа SQL.Затем параметр объединяется, когда MySQL выполняет запрос, но уже слишком поздно для любой попытки внедрения SQL-кода изменить способ анализа запроса.
Именно поэтому параметры запроса являются хорошим методом защиты вашего приложения от SQLинъекции.