Intereting Posts
как отправить данные onClick () на другой php для обработки с помощью сообщения или получения? Слишком большие данные POST. Уменьшите данные или увеличьте значение "post_max_size" Подход к безопасности загрузки изображений PHP Как получить вывод при использовании fsockopen для открытия php-страницы? как заполнить при выпадающем основании значение из другого выпадающего списка в php и jquery? SMTP: Не удалось подключить разъем: невозможно найти перенос сокета «ssl" cURL multi висит / игнорирует таймаут http: // localhost / не работает в Windows 7. В чем проблема? Codeigniter: лучшая практика для просмотра сеанса доступа exec () и phantomjs с абсолютными путями Проверьте, существует ли имя пользователя с MySQLi установление соединения из файла include FallbackResource работает для некоторых страниц, но не для других. Лучший способ получить объект запроса из форм Symfony? Производительность try-catch в php

Какие символы НЕ экранированы с помощью подготовленного оператора mysqli?

Я пытаюсь закрепить некоторые из своих 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 для сопоставления имени пользователя с виной, а не от функции.

И только для вашей информации: родные подготовленные заявления ничего не избегают .