Я пытаюсь закрепить некоторые из своих PHP-кода и использовать подготовленные инструкции mysqli для лучшей проверки ввода пользователя и предотвращения инъекционных атак.
Я перешел от mysqli_real_escape_string, так как он не убегает% и _ . Однако, когда я создаю свой запрос в качестве подготовленного оператора mysqli, тот же недостаток все еще присутствует. Запрос вытаскивает значение соты пользователей на основе их имени пользователя. Я бы сделал что-то подобное для паролей и других поисковых запросов.
Код:
$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;
Благодаря,
%
не является неотъемлемо вредным характером.
Вопрос в том, почему вы используете LIKE
в первую очередь? Существуют ли какие- либо обстоятельства, при которых вам не требуется точное совпадение имени пользователя?
Запрос должен быть простым:
SELECT `salt` FROM admins WHERE `username` = ? LIMIT 1
В этом случае, если бы я должен был ввести %bsmith
мое имя пользователя должно было быть (буквально) «% bsmith», чтобы вы могли найти совпадение.
Здесь вы смешиваете два разных уровня оценки.
Оператор LIKE
берет строку и оценивает любые '%'
и '_'
качестве заполнителей.
Задача параметров запроса заключается в том, чтобы довести значения (например, строки) дословно до механизма базы данных, поэтому их нельзя ошибочно принять за код SQL. Им все равно, как оператор LIKE
использует специальные символы в строке, которую они только что перевезли. Все работает так, как здесь.
Если вам нужны точные совпадения, используйте оператор =
вместо LIKE
.
Если вы должны использовать LIKE
(даже если ваш LIMIT 1
здесь указывает иначе), заранее избегайте специальным символам самостоятельно.
Это символы, которые не ускользают от подготовленных операторов% _ \
Это тот, кто использует LIKE для сопоставления имени пользователя с виной, а не от функции.
И только для вашей информации: родные подготовленные заявления ничего не избегают .