Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / php & mysql / 8 сообщений из 8, страница 1 из 1
15.02.2014, 10:46
    #38561745
BIS-10-2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
Привет всем помогите плз с таким вопросом: Имеется поисковая форма(search.html). В ней пользователь может выбрать тип поиска(по автору, по названию, по ISBN). B затем вводит само значение поиска. То есть например получается "по автору" и "Майкл". После щелчка "найти" вызывается сценарий "results.php". В ней осуществляется запрос к БД и вывод результата запроса. Проблема в том, что ввожу имя существующего в БД автора(русскими буквами). Запрос выводит 0 строк. Потом зашел в БД и поменял имя автора(написал англ буквами). Сценарий сразу заработал и вывел все книги этого автора. Вопрос: почему php-сценарий не может найти руссконаписанные слова в БД.
это код search.html
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<html>
<head>
  <title>Магазин "Буквофил" – Поиск в каталоге</title>
</head>

<body>
  <h1>Магазин "Буквофил" - Поиск в каталоге</h1>
  <form action="results.php" method="post">
    Выберите тип поиска:

    <select name="searchtype">
      <option value="author">По автору</option>
      <option value="title">По названию</option>
      <option value="isbn">По ISBN</option>
    </select>
    

    Введите информацию для поиска:

    <input type="text" name="searchterm" size="40" />
    

    <input type="submit" name="submit" value="Найти" />
  </form>

</body>
</html>


А это results.php:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
<html>
<head>
  <title>Магазин "Буквофил" – Результаты поиска</title>
</head>
<body>
<h1>Магазин "Буквофил" - Результаты поиска</h1>
<?php
  // создание коротких имен переменных
  $searchtype = $_POST['searchtype'];
  $searchterm = trim($_POST['searchterm']);

  if (!$searchtype || !$searchterm) {
     echo 'Вы не ввели параметры поиска. Вернитесь' .
          ' на предыдущую страницу и повторите ввод.';
     exit;
  }

  if (!get_magic_quotes_gpc()) {
    $searchtype = addslashes($searchtype);
    $searchterm = addslashes($searchterm);
  }

  @ $db = new mysqli('localhost', 'books', 'glormanutd', 'books');
  $errn = mysqli_connect_errno();
  if (mysqli_connect_errno()) {
     echo 'Ошибка: Не удалось установить соединение' . 
          ' с базой данных. Повторите попытку позже.';
     exit;
  }

  $query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
  $result = mysqli_query($db, $query);
  $num_results = $result->num_rows;
  echo "<p>Найдено книг: ".$num_results."</p>";

  for ($i = 0; $i < $num_results; $i++) {
     $row = $result->fetch_assoc();
     echo "<p><strong>".($i+1).". Название: ";
     echo htmlspecialchars (stripslashes($row['title']));
     echo "</strong>
Автор: ";
     echo stripslashes($row['author']);
     echo "
ISBN: ";
     echo stripslashes($row['isbn']);
     echo "
Цена: ";
     echo stripslashes($row['price']);
     echo "</p>";
  }

  $result->free();
  $db->close();
?>

</body>
</html>
...
Рейтинг: 0 / 0
15.02.2014, 11:04
    #38561749
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
BIS-10-2,

Кодировка )) Как всегда...

Смотрим кодировку выводимой страницы, кодировку самого скрипта и кодировку соединения с базой... Все три должны быть одинаковыми.

если Вы попробуете вывести имя автора (русского) на страницу, то скорее всего увидите крякозябры. И скорее всего (что чаще всего бывает) что неверная кодировка именно соединения (устанавливается запросом "SET NAMES 'кодировка'")

И ещё... предполагаю, что такой запрос очень просто взломать и получить доступ к базе. Мне что-то помнится, что addslashes не экранирует обратные кавычки вот рекомендации
...
Рейтинг: 0 / 0
15.02.2014, 12:36
    #38561769
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
Програмёр,

addslahes, впрочем как и другие потуги - не защищают от взлома базы - ни разу.
Хотите защиту:
1. Не загоняйте в запрос к БД прямые данные из входа.
2. Если выполнить п.1 невозможно, то пользуйте параметризованные запросы _только_.

Всё остальное - наивная дурь.
...
Рейтинг: 0 / 0
15.02.2014, 13:08
    #38561783
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
Arhat109Програмёр,

addslahes, впрочем как и другие потуги - не защищают от взлома базы - ни разу.
Хотите защиту:
1. Не загоняйте в запрос к БД прямые данные из входа.
2. Если выполнить п.1 невозможно, то пользуйте параметризованные запросы _только_.

Всё остальное - наивная дурь.

Насчёт первого - согласен, желательно проводить валидацию данных всегда.
Но вот в общем... Я например не представляю как можно взломать базу запросом, в котором все пользовательские данные экранированы. Если Вы знаете, мне было бы интересно ознакомиться с подобными методами взлома, что бы сделать свои кода более надёжными.
...
Рейтинг: 0 / 0
15.02.2014, 15:59
    #38561852
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
Програмёр,

Щас лениво, и есть большая и интересная задачка. Пошукайте на Хабре была хорошая статья с примерами.

Суть в том, что если не проходит простой взлом, то повторное экранирование - проходит. Как-то так.

Гораздо проще привыкнуть к бинтованию всего и вся, чем каждый раз заморачиваться и гадать "какая форма запроса вскроет эту фигню". И ещё один момент, с которым сталкивался сам: экранирование не всегда спасает и на валидных данных. Неожиданно при перезаписи в БД уже записанных туда данных получаешь HY093.
...
Рейтинг: 0 / 0
17.02.2014, 08:10
    #38562618
BIS-10-2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
в results.php внес строку "mysql_set_charset('utf8')". Все равно не находит автора. Я тут подумал, а почему он не выводит его хоть кракозябрами? Получается он не может в таблице понять русские символы?
Проверьте правильно ли я вставил "mysql_set_charset('utf8')".
results.php:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Магазин "Буквофил" – Результаты поиска</title>
</head>
<body>
<h1>Магазин "Букафил" - Результаты поиска</h1>
<?php
  // создание коротких имен переменных
  $searchtype = $_POST['searchtype'];
  $searchterm = trim($_POST['searchterm']);

  if (!$searchtype || !$searchterm) {
     echo 'Вы не ввели параметры поиска. Вернитесь' .
          ' на предыдущую страницу и повторите ввод.';
     exit;
  }

  if (!get_magic_quotes_gpc()) {
    $searchtype = addslashes($searchtype);
    $searchterm = addslashes($searchterm);
  }

  @ $db = new mysqli('localhost', 'books', 'glormanutd', 'books');
mysql_set_charset('utf8');
  $errn = mysqli_connect_errno();

  if (mysqli_connect_errno()) {
     echo 'Ошибка: Не удалось установить соединение' . 
          ' с базой данных. Повторите попытку позже.';

     exit;
  }

  $query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
  $result = $db->query($query);
  $num_results = $result->num_rows;
  echo "<p>Найдено книг: ".$num_results."</p>";

  for ($i = 0; $i < $num_results; $i++) {
     $row = $result->fetch_assoc();
     echo "<p><strong>".($i+1).". Название: ";
     echo htmlspecialchars (stripslashes($row['title']));
     echo "</strong>
Автор: ";
     echo stripslashes($row['author']);
     echo "
ISBN: ";
     echo stripslashes($row['isbn']);
     echo "
Цена: ";
     echo stripslashes($row['price']);
     echo "</p>";
  }

  $result->free();
  $db->close();
?>

</body>
</html>
...
Рейтинг: 0 / 0
18.02.2014, 00:03
    #38563758
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
BIS-10-2,

Код: php
1.
if (!get_magic_quotes_gpc()) {



что за гамно мамонта?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
for ($i = 0; $i < $num_results; $i++) {
     $row = $result->fetch_assoc();
     echo "<p><strong>".($i+1).". Название: ";
     echo htmlspecialchars (stripslashes($row['title']));
     echo "</strong>
Автор: ";
     echo stripslashes($row['author']);
     echo "
ISBN: ";
     echo stripslashes($row['isbn']);
     echo "
Цена: ";
     echo stripslashes($row['price']);
     echo "</p>";
  }



Гуглить "шаблонизатор"

Код: php
1.
$db = new mysqli('localhost', 'books', 'glormanutd', 'books');


Код: php
1.
mysql_set_charset('utf8');


Ниче не смущает?

Короче, чувак, не тыкай пальцем в небо
...
Рейтинг: 0 / 0
05.11.2014, 14:51
    #38796383
des1roer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
php & mysql
как сэкранировать + ?
Код: php
1.
$choise = "  \"F_Date\" >timestamp\'$dt 16:00:00\'   and \"F_Date\" <= (timestamp\'$dt 00:00:00\' \+ \"interval\" \'1 day\') "; 
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / php & mysql / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]