Ответ 1
Теперь, если предположить, что эти 4 переменных были введены пользователем, я не понимаю как это предотвращает инъекции SQL. По моему мнению, они все еще могут введите туда, где они хотят.
Основным принципом является использование подготовленного оператора, который предназначен для отправки безопасного запроса на сервер db, это может быть сделано путем исключения пользовательского ввода, который не является частью реального запроса, а также проверки запроса без какого-либо предложения where (where) для проверки правильности запроса перед использованием любых параметров.
Из этого вопроса: PDO отправляет необработанный запрос в MySQL, в то время как Mysqli отправляет подготовленный запрос, оба дают тот же результат
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username =?")) {
$stmt->bind_param("i", $user);
$user = "''1''";
журналы сервера:
130802 23:39:39 175 Connect ****@localhost on testdb
175 Prepare SELECT * FROM users WHERE username =?
175 Execute SELECT * FROM users WHERE username =0
175 Quit
Используя подготовленный оператор, сервер db будет проверять запрос без каких-либо параметров, на этом этапе ошибки могут быть обнаружены до привязки какого-либо параметра, а затем, если запрос был действительным, параметры также будут отправляться на сервер для завершения запрос.
Из руководства PHP http://php.net/manual/en/mysqli.quickstart.prepared-statements.php:
Экранирование и SQL-инъекция
Связанные переменные будут автоматически экранированы сервером. сервер вставляет свои экранированные значения в соответствующие места в перед выполнением. Подсказка должна быть предоставлена сервера для типа связанной переменной, чтобы создать соответствующий преобразование. См. Функцию mysqli_stmt_bind_param() для получения дополнительной информации. информация.
..
Я также не могу найти объяснение для 'sssd'. Что это делать? Это то, что делает его безопасным?
Ответ здесь: http://php.net/manual/en/mysqli-stmt.bind-param.php
i
corresponding variable has type integer
d
corresponding variable has type double
s
corresponding variable has type string
b
corresponding variable is a blob and will be sent in packets
Заключительный вопрос: я прочитал еще один вопрос, который mysqli_real_escape_string устарел, но он не говорит, что в руководство. Как он устарел? Не может ли он избежать специальных символов? по какой-то причине?
Можете ли вы дать ссылку? Я думаю, вы неправильно поняли (mysql_real_escape_string()
)