Я возился со своей страницей поиска. Я добавил оба mysqli_real_escape_string
а также strip_tags
и, насколько я могу судить, все работает нормально и должно быть в безопасности.
Я просто пытался ввести случайные символы в форму поиска, чтобы посмотреть, все ли записи в моей базе данных все еще можно найти с помощью этих мер безопасности. Все хорошо, кроме случаев, когда я ищу одну кавычку ('
).
Это дает мне сообщение «mysqli_num_rows () ожидает, что параметр 1 будет иметь значение mysqli_result, boolean учитывая». Об этой ошибке много информации, и я знаю, как ее исправить (по крайней мере, я так думал). Тем не менее, в данном конкретном случае я понятия не имею: /
Код:
ini_set('display_errors', 1);
$search = $_GET ['q'];
$conn = mysqli_connect("localhost", "root", "","release");
$search = mysqli_real_escape_string($conn, "$search");
$search = stripslashes(strip_tags(trim("$search")));
$query = mysqli_query($conn,"SELECT * FROM game WHERE game_name LIKE '%". $search ."%' ORDER BY game_release");
$count = mysqli_num_rows($query);
Вы должны использовать mysqli_real_escape_string
в самом конце, прямо перед вводом переменной в запрос к базе данных, хотя подготовленные операторы предпочтительнее. И проще, насколько я понимаю.
Ваша текущая проблема не в том, что вы не можете сделать это просто mysqli_real_escape_string
, но комбинация и порядок используемых вами функций:
$search = mysqli_real_escape_string($conn, "$search");
$search = stripslashes(strip_tags(trim("$search")));
Вы экранируете специальные символы для значений mysql в первой строке. Это делается путем добавления косой черты.
А во второй строке вы удаляете косые черты, удаляя свой выход с mysqli_real_escape_string
и сделать ваш запрос уязвимым для SQL инъекций.
Что касается безопасности для оператора SQL, mysqli_real_escape_string
достаточно, так что для этого вам понадобится только подготовленное заявление или:
$search = mysqli_real_escape_string($conn, $search);
В остальном нет необходимости, но если вы хотите сделать это каким-либо образом (например, если теги не разрешены), вам следует переместить эту строку выше последней экранирующей строки:
$search = stripslashes(strip_tags(trim($search)));
$search = mysqli_real_escape_string($conn, $search);
// and now run your query without further manipulation:
$query = mysqli_query(...);
Других решений пока нет …