Я не понимаю, почему никто не пытался ответить на этот вопрос или даже комментировать. ТАК работает загадочным образом, я думаю ...;) Во всяком случае, я исследовал достаточно (я так думаю), чтобы иметь возможность ответить на это сам, с определенной степенью уверенности.
Так что, по сути, подготовленные запросы намного безопаснее, чем просто экранирование ввода, например mysql_real_escape_string();
, потому что, как говорили некоторые мудрые люди:
Да, mysql_real_escape_string - фактически просто функция экранирования строки. Это не волшебная пуля. Все, что он будет делать, это экранировать опасные символы, чтобы их можно было безопасно использовать в одной строке запроса. Однако, если вы не очистите свои входные данные заранее, вы будете уязвимы для определенных векторов атаки.
Ссылка на полный ответ: mysql_real_escape_string
Итак, что я сделал для проверки моего подготовленного утверждения против экранирования - я сделал простую форму отправки и попытался очистить входные данные с помощью mysql_real_escape_string();
, и, конечно, это не удалось с примерами типа "1 OR 1=1"
, некоторые люди предложили добавить экранированные значения внутри одинарных кавычек:
$ query = "SELECT * FROM mydb WHERE ID = '". $ EscapedID. "'";
Это помогает предотвратить пример "1 OR 1=1"
, но, безусловно, это не лучшая практика. Проблема с экранированием заключается в том, что он не защищает от людей, которые изменяют логику вашего запроса злонамеренным образом.
Так что теперь я буду придерживаться подготовленных заявлений ADODB. Как в моем исходном вопросе выше или более короткая версия bobby-tables веб-сайт:
$dbConnection = NewADOConnection($connectionString);
$sqlResult = $dbConnection->Execute(
'SELECT user_id,first_name,last_name FROM users WHERE username=? AND password=?'
, array($_POST['username'], sha1($_POST['password']) );
Другие очень полезные вопросы, касающиеся SQL-инъекций:
Также посмотрите это видео, оно значительно упрощает понимание SQL-инъекций: