Какие символы НЕ экранированы с помощью подготовленного 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, чтобы обвинить имя пользователя, а не экранирование функции.

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

Другие вопросы по тегам