Какие символы НЕ экранированы с помощью подготовленного mysqli оператора?
Я пытаюсь укрепить часть своего PHP-кода и использовать подготовленные операторы mysqli, чтобы лучше проверять пользовательский ввод и предотвращать инъекционные атаки.
Я отключился от mysqli_real_escape_string, так как он не выходит из % и _. Однако, когда я создаю свой запрос как подготовленное MySQL заявление, тот же недостаток все еще присутствует. Запрос извлекает солт-значение пользователя в зависимости от его имени. Я бы сделал что-то подобное для паролей и других поисков.
Код:
$db = new sitedatalayer();
if ($stmt = $db->_conn->prepare("SELECT `salt` FROM admins WHERE `username` LIKE ? LIMIT 1")) {
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($salt);
while ($stmt->fetch()) {
printf("%s\n", $salt);
}
$stmt->close();
}
else return false;
- Я правильно сочиняю утверждение?
- Если я, какие еще персонажи нужно изучить? Какие еще недостатки есть?
- Какова наилучшая практика для этих типов выбора?
Спасибо,
4 ответа
%
не является по своей сути вредным характером.
Вопрос в том, почему вы используете LIKE
на первом месте? Существуют ли обстоятельства, при которых вам не требуется точное совпадение имени пользователя?
Запрос должен быть просто:
SELECT `salt` FROM admins WHERE `username` = ? LIMIT 1
В том случае, если бы я должен был войти %bsmith
мое имя пользователя (буквально) должно быть "%bsmith", чтобы вы могли найти совпадение.
Вы путаете два разных уровня оценки здесь.
LIKE
Оператор берет строку и оценивает любой '%'
а также '_'
в качестве заполнителей.
Задача параметров запроса заключается только в том, чтобы дословно приводить значения (например, строки) в ядро базы данных, чтобы их нельзя было принять за код SQL. Им все равно, как LIKE
Оператор специально использует определенные символы в только что перенесенной строке. Здесь все работает так, как задумано.
Если вы хотите точные совпадения, используйте =
оператор вместо LIKE
,
Если вы должны использовать LIKE
(хотя ваш LIMIT 1
здесь указано иное), предварительно избегайте специальных символов соответственно.
Это символы, не экранированные подготовленными выражениями% _ \
Это тот, кто использует LIKE, чтобы обвинить имя пользователя, а не экранирование функции.
И, только для вашей информации: нативно подготовленные заявления ничего не избегают.