Я пришел далеко, чтобы получить базовое понимание подготовленных операторов, и я понимаю, что они предотвращают атаки SQL-инъекций. Но мне еще предстоит понять, ПОЧЕМУ они защищают от указанных атак. Я знаю, что есть похожие вопросы, но я не нашел ответы полностью удовлетворительными.
Пример – очень опасный код
Итак, у нас есть самый простой способ общения с нашей базой данных:
$query = "SELECT * FROM users where id=$username";
Без какой-либо защиты пользователь может вводить вредоносный код и, таким образом, «обманывать» механизм базы данных для выполнения разрушительного запроса:
$username = "1; DROP TABLE users;" SELECT * FROM users where id=1; DROP TABLE users;
Я не понимаю, как подготовленное заявление удается «отфильтровать» такие данные. Что за механика стоит за этим, не заманивает базу данных для создания такого SQL-запроса, как показано выше? Так же просто, как избежать определенных символов, таких как точка с запятой в приведенном выше примере, или это сложнее?
Если бы я сделал точную инъекционную атаку, как в примере, но запустил ее через подготовленный оператор, какая командная строка достигнет ядра базы данных?