<?[SPAN=darling][SPAN=darling]php[/SPAN][/SPAN]
session_start();
$host = "host";
$dbuser = "user";
$dbpass = "pass";
$db = "db";
$connect = [SPAN=darling]mysql[/SPAN]_connect($host, $dbuser, $dbpass) or die("connection failed");
[SPAN=darling]mysql[/SPAN]_select_db($db, $connect) or die("db selection failed");
[SPAN=darling]mysql[/SPAN]_query("SET NAMES cp1251;");
if($_GET['submit_search'])
if(isset($_GET['search'])){
$search = $_GET['search'];
$search = htmlspecialchars($search);
$search = trim($search);
$search = [SPAN=darling]mysql[/SPAN]_real_escape_string($search);
$q = "SELECT * FROM `names`
WHERE `name` LIKE '%".$search."%'";
$query = [SPAN=darling]mysql[/SPAN]_query($q) or die("search query failed");
$num = [SPAN=darling]mysql[/SPAN]_num_rows($query);
if($num){
echo "<b>Найдено пользователей:".$num."</b><br />";
echo "<UL>";
while($assoc = [SPAN=darling]mysql[/SPAN]_fetch_assoc($query)){
echo "<LI>".$assoc['name']."<br />";
}
echo "</UL>";
}
else
echo "<b><font size=5 color=red>Ничего не найдено</font></b>";
echo "<HR>";
}
if($_POST['submit_register']){
if(isset($_POST['register']) && $_POST['register']!="" && $_SESSION['reg'] < $_GET['r']){
$reg = $_POST['register'];
$reg = htmlspecialchars($reg);
$reg = trim($reg);
$reg = [SPAN=darling]mysql[/SPAN]_real_escape_string($reg);
$query = [SPAN=darling]mysql[/SPAN]_query("
INSERT INTO `names` (`name`)
VALUES ('$reg');
") or die("reg query failed");
$_SESSION['reg'] = $_GET['r'];
}
}
if(isset($_GET['id'])){
$getted_id = $_GET['id'];
$user_info_query = [SPAN=darling]mysql[/SPAN]_query ("
SELECT * FROM `names` WHERE `id` = '$getted_id'
") or die("select query failed");
$user = [SPAN=darling]mysql[/SPAN]_fetch_assoc($user_info_query);
echo "<b><font size=5>Дата регистрации пользователя <font color = blue>".$user['name']."</font>:".$user['date']."</font></b>";
}
$query = [SPAN=darling]mysql[/SPAN]_query ("
SELECT * FROM `names` ORDER BY `id` DESC
") or die("select query failed");
echo "<UL>";
while($info=[SPAN=darling]mysql[/SPAN]_fetch_assoc($query)){
echo "<LI> <a href = index.php?id=".$info['id'].">".$info['name']."</a><br />";
}
echo "</UL>";
echo "Поиск<br />";
echo "<form name = searching method = GET action =".$_SERVER['PHP_SELF'].">";
echo "<input type = text name = search ><br />";
echo "<input type = submit name = submit_search value = 'Поиск'>";
echo "</form>";
echo "<br />";
$timestamp = time();
echo "Регистрация<br />";
echo "<form name = registration method = POST action = index.php?r=".$timestamp." >";
echo "<input type = text name = register ><br />";
echo "<input type = submit name = submit_register value = 'Зарегестрировать'>";
echo "</form>";
Проблема : баги с поиском. нашел по крайней мере 2: непонятно почему при поиске "g" находит помимо правильных результатов "<Jensen & partners>", поиск бэкслэша результата не даёт.
Разъясните, если не трудно, дыры приложения(если такие есть), помимо указанной, правильно ли реализована регистрация: защита от SQL-инъекции и F5?
Просьба сильно камнями не кидаться, код написан за день, еще додумываю.
Текущая рабочая версия :
Твина : здесь
Постановка задачи : Задача
Спустя 7 часов, 25 минут, 10 секунд (29.07.2009 - 08:27) sergeiss написал(а):
Вот смотри. Ты написал
SQL |
$search = $_GET['search']; if(isset($search)){ ... |
Но это некорректно!!! Потому что переменная $search будет определена всегда. Ты же ее только что определяешь. А эта функция проверяет, была ли определена переменная, или ее нет вообще.
Поэтому надо проверять либо величину, находящуюся в $search, либо наличие в гете этой величины:
PHP |
if( isset( $_GET['search'] ) |
Это сравнение будет корректным, потому что если такой параметр не был передан в адресной строке, то и не будет такого элемента массива.
Далее.
Это сё???
PHP |
$query = mysql_query (" |
Тебе нужно получить количество? Так и пиши запрос
SQL |
select count(*) from .... |
Более глубоко не смотрел, перечисленное выше - это то, что сразу "бросилось в глаза".
Спустя 4 часа, 27 минут, 31 секунда (29.07.2009 - 12:55) Raito-kun написал(а):
Спасибо, sergeiss, по поводу isset не заметил даже. Исправил.
А это:
А это:
PHP |
$query = mysql_query (" |
используется дальше после цикла. просто цикл влепил между запросом и его использованием и испортилась наглядность(а $num убрал, этот параметр мне нужен был для отладки). Исправил наглядность:
PHP |
$query = mysql_query (" |
Все-таки не пойму почему поиск работает криво. Особенно интересен результат поиска "g".
Спустя 4 минуты, 21 секунда (29.07.2009 - 12:59) Kuliev написал(а):
Raito-kun
PHP |
$sql = ("SELECT * FROM `names` ORDER BY `id` DESC"); |
Спустя 2 часа, 32 минуты, 35 секунд (29.07.2009 - 15:32) twin написал(а):
Для двух месяцев вполне недурно.
Но. Задача не решена.
1. Есть уязвимость в плане инъекций.
1. Скрипт зависим от настройки magic_quotes
2. Не защищен от F5
3. Данные при поиске не возвращаются в поле.
Это ключевые моменты, которые определяют корректность обработки данных.
По стилю.
Нет единого стиля написания кода. Вот тут запрос с конкатенацией и перезаписью:
Но. Задача не решена.
1. Есть уязвимость в плане инъекций.
1. Скрипт зависим от настройки magic_quotes
2. Не защищен от F5
3. Данные при поиске не возвращаются в поле.
Это ключевые моменты, которые определяют корректность обработки данных.
По стилю.
Нет единого стиля написания кода. Вот тут запрос с конкатенацией и перезаписью:
PHP |
$q = "SELECT * FROM `names` |
А ниже совсем иначе. Это очень путает при беглом просмотре, а значит отнимает больше времени на разбор кода. Это же касается и разнообразия кавычек.
Переменные не отражают сути, это тоже путает. Вот это
PHP |
$user = mysql_fetch_assoc($user_info_query); |
никакой не юзер, а ряд результата запроса. Нужно так его и назвать:
PHP |
$row = mysql_fetch_assoc($user_info_query); |
По оптимальности.
1.Тут совсем незачем использовать сессию. Это лишнее ресурсопотребление.
2. Конструкция echo , да еще и в таких количествах, тут явный перебор. Незачем напрягать php процессор, если можно сделать вывод обычным html/
Ну для начала хватит, на кое что указали sergeiss и Kuliev
А вообще за смелость и желание разобраться огромный респект.
Жду работу над ошибками. Объяснять ничего не буду, потому что это должно родиться само.
Спустя 12 часов, 23 минуты, 15 секунд (30.07.2009 - 03:55) Raito-kun написал(а):
спасибо за комментарии. посидел, подумал. нашел ответы на свои вопросы. нашел уязвимость, вроде единственную, и исправил. сделал возврат поиска в форму. Решил проблему с поиском бэкслэша. частично исправил стилевые ошибки. текуий код:
PHP |
<?php |
Понял почему находится "<Jensen & partners>" при поиске "g". Ибо в базе символ ">" преобразован в сущность ">". Пока в поиске решения. magic_quotes меня добивает. просто пишу на локалхосте,все отлично работает, а скинув на сайт даже не смотрел, что там они включены. и сейчас из-за них проблема с поиском. думаю, исправляю. насчет F5 : как раз для защиты ввел сессии(может это выглядит по-идиотски, сам ненавижу писать/читать халтурный код, но пока не придумал иной защиты) и вроде работает. при регистрации и нажатии F5 второй регистрации не происходит. Эта версия доступна по тому же адресу
Спустя 18 часов, 28 минут, 48 секунд (30.07.2009 - 22:24) twin написал(а):
Читабельность на много лучше, а вот по коду пока хромает. Уязвимость от инъекций не ушла, от XSS тоже. Реализация проверки magic_quotes неверная.
Но уже гараздо ближе к теме. Вот когда решишь полностью, никто тебе страшен не будет.
А остальные пусть завидуют
PS Маленькая подсказка. От F5 лучше защищаться перенаправлением, а не сессией.
Но уже гараздо ближе к теме. Вот когда решишь полностью, никто тебе страшен не будет.
А остальные пусть завидуют
PS Маленькая подсказка. От F5 лучше защищаться перенаправлением, а не сессией.
Спустя 1 день, 4 часа, 48 минут, 12 секунд (1.08.2009 - 03:12) Raito-kun написал(а):
Пока что реализовал правильную обработку наличия magic_quotes on
функцией
функцией
PHP |
if (get_magic_quotes_gpc()) { |
пока изучаю защиту от XSS, т.к. инъекция уже не проходит. вот интересно. и у меня и у вас некорректен поиск символа "%". точнее, поиск "процента" выдаёт полный список пользователей. prooflink. с чем это может быть связанно?
Спустя 6 часов, 19 минут, 19 секунд (1.08.2009 - 09:31) twin написал(а):
Цитата |
Пока что реализовал правильную обработку наличия magic_quotes on |
Вооот. Это гут. Только учти на будущее, что под "раздачу" попадает еще и массив $_COOKIE, потому эта директива и называется - gpc
А процент связан не столько с обработкой данных, сколько с особенностями оператора SQL LIKE Эту проблему можно конечно решить, но она настолько специфична и несущественна, что в данном контексте наверное не стоит сильно заостряться.
А процент связан не столько с обработкой данных, сколько с особенностями оператора SQL LIKE Эту проблему можно конечно решить, но она настолько специфична и несущественна, что в данном контексте наверное не стоит сильно заостряться.
Спустя 1 день, 18 часов, 1 минута, 17 секунд (3.08.2009 - 03:32) Raito-kun написал(а):
по поводу расшифровки gpc не знал, спасибо. нашел еще что от magic_quotes чистят $_SESSION переменные. это правильно?
уже достаточно вымотан этой задачей. перечитал кучу статей по защите от XSS, везде одно и тоже htmlspecialchars(), strip_tags() и прочее. вроде бы все что нужно включено в скрипт, но меня за целый день так и не осенило что не так с поиском символа %22 он же двойная кавычка("). Благодаря именно этому символу и возможен XSS. ув. twin, если не трудно, хотя бы намекните где загвоздка в коде. почему все спец.символы обрабатываются нормально, только с двойной кавычкой беда
по вашему совету убрал сессии, сделал редирект. текущий код:
Главное если сделать echo $search." ".$_GET['search']; в середине поиска, то результат правильный (" "). Но почему же эта двойная кавычка не хочет возвращаться в форму?
уже достаточно вымотан этой задачей. перечитал кучу статей по защите от XSS, везде одно и тоже htmlspecialchars(), strip_tags() и прочее. вроде бы все что нужно включено в скрипт, но меня за целый день так и не осенило что не так с поиском символа %22 он же двойная кавычка("). Благодаря именно этому символу и возможен XSS. ув. twin, если не трудно, хотя бы намекните где загвоздка в коде. почему все спец.символы обрабатываются нормально, только с двойной кавычкой беда
по вашему совету убрал сессии, сделал редирект. текущий код:
Свернутый текст
PHP |
<?php |
Главное если сделать echo $search." ".$_GET['search']; в середине поиска, то результат правильный (" "). Но почему же эта двойная кавычка не хочет возвращаться в форму?
Спустя 3 часа, 26 минут, 47 секунд (3.08.2009 - 06:59) kirik написал(а):
Цитата (Raito-kun @ 2.08.2009 - 19:32) |
по поводу расшифровки gpc не знал, спасибо. нашел еще что от magic_quotes чистят $_SESSION переменные. это правильно? |
Ну смотри, если расшифровка gpc это Get, Post, Cookies, то нужно ли чистить Session?
Цитата (Raito-kun @ 2.08.2009 - 19:32) |
перечитал кучу статей по защите от XSS, везде одно и тоже htmlspecialchars(), strip_tags() и прочее. |
Для защиты от XSS вполне хватит одной htmlspecialchars(), так как html тэги отображаться уже не будут. Про двойную кавычку, нужно обратится к справочнику на php.net (или другой справочник), где можно будет прочитать:
Цитата |
В режиме по умолчанию, ENT_COMPAT, преобразуются двойные кавычки, одиночные остаются без изменений. В режиме ENT_QUOTES преобразуются и двойные, и одиночные кавычки. а в режиме ENT_NOQUOTES и двойные, и одиночные кавычки остаются без изменений. |
Спустя 4 часа, 37 минут, 55 секунд (3.08.2009 - 11:37) twin написал(а):
Цитата |
если не трудно, хотя бы намекните где загвоздка в коде |
Всё очень просто. Одно правило: все, что выдается в браузер, должно обрабатываться функцией htmlspecialchars()
<input type = text name = search value = "<?[SPAN=darling]php[/SPAN] echo htmlspecialchars($_GET['search']); ?>">
А по сей причине совсем некчиму эту функцию применять при работе с запросами. Если ты сейчас посмотришь в базу, то увидишь, что юзер <Вася> превратился у тебя в юзера <Вася>, а он и обидеться может
Так что строчки
$reg = htmlspecialchars($reg);и
$search = htmlspecialchars($search);
Это явный перебор, к тому же ты используешь после них
mysql_real_escape_string().
Вот если убрать первые две и добавить в инпут обработку, то все будет корректно, красиво и правильно.
Спустя 4 минуты, 15 секунд (3.08.2009 - 11:41) twin написал(а):
Еще маленький штрих вот тут
PHP |
if($_POST['submit_register']){ |
редирект лучше делать после запроса и ставить после него exit(); чтобы скрипт не молотил пустоту. Это лишний ресурс.
Спустя 10 часов, 27 минут, 29 секунд (3.08.2009 - 22:09) Raito-kun написал(а):
УРА! Я счастлив) Всё получилось) Пример действительно очень познавательный! Твин, вы заслуживаете уважения за размещение этой задачи на форуме и разъяснения, благодаря которым стало возможно разобраться в корректной обработке данных, а также узнать хорошие приемы в веб-программировании . Самоучители такого не дают однозначно. Спасибо всем экспертам за помощь и дополнения!
Код:
Тест: url (временами сайт не работает - хостинг бесплатный)
Код:
Свернутый текст
PHP |
<?php |
Тест: url (временами сайт не работает - хостинг бесплатный)
Спустя 26 минут, 40 секунд (3.08.2009 - 22:36) twin написал(а):
Ну вот... И я внес небольшую лепту... А то страшно по сети ходить стало уже
Спустя 13 дней, 11 часов, 49 минут, 3 секунды (17.08.2009 - 10:25) ApuktaChehov написал(а):
А можно мне тоже выложить свой вариант?
Спустя 35 минут, 2 секунды (17.08.2009 - 11:00) glock18 написал(а):
Выкладывай ))
А твину действительно респект. Хороший подбор требований. Этакий "денвер" ))) (джентльменский набор веб разработчика)
А твину действительно респект. Хороший подбор требований. Этакий "денвер" ))) (джентльменский набор веб разработчика)
Спустя 1 час, 10 минут, 9 секунд (17.08.2009 - 12:10) Guest написал(а):
PHP |
<?php |
Спустя 3 минуты, 34 секунды (17.08.2009 - 12:13) ApuktaChehov написал(а):
Блин. Это был я. Что ж у меня все время авторизация слетает
P.S.
В конце, в место вот этого:
P.S.
В конце, в место вот этого:
PHP |
$_GET['find_name']=htmlspecialchars($_GET['find_name']); |
вот это:
PHP |
$_GET['find_name']=inputclean($_GET['find_name']); |
Спустя 31 минута, 16 секунд (17.08.2009 - 12:45) twin написал(а):
Лучше отдельную ветку открой. А так в куче все ответы будут - некрасиво.
А я посмотрю и там уже отвечу.
А я посмотрю и там уже отвечу.
Спустя 1 месяц, 16 дней, 8 часов, 24 минуты, 47 секунд (3.10.2009 - 21:09) Pinoplast написал(а):
Задачка познавательная ставлю 5
Спустя 13 часов, 49 минут, 40 секунд (4.10.2009 - 10:59) Michael написал(а):
Цитата (Pinoplast @ 3.10.2009 - 18:09) |
Задачка познавательная ставлю 5 |
Pinoplast, а ну ка вперед - выполнять задачку.
А оценку twin тебе будет выставлять .
Спустя 4 часа, 50 минут, 44 секунды (4.10.2009 - 15:50) Pinoplast написал(а):
Судовольствием выполнил бы. но я пишу свой проект, а там весь этот гиморой на каждом шагу, с чем сталкуюсь с тем и копаюсь, щас статистику по сайту пишу
Спустя 6 минут, 42 секунды (4.10.2009 - 15:57) Michael написал(а):
Pinoplast, ну вот откуда знаешь, что сделаешь
все правильно у себя - а тут потренируешься и бока увидишь.
P.S. Статистика может и подождать, на то она и статистика, что никому не надо.
все правильно у себя - а тут потренируешься и бока увидишь.
P.S. Статистика может и подождать, на то она и статистика, что никому не надо.
Спустя 15 минут, 19 секунд (4.10.2009 - 16:12) glock18 написал(а):
Цитата |
P.S. Статистика может и подождать, на то она и статистика, что никому не надо. |
зря, вы батенька. грамотная статистика говорит о многом тем, кому это интересно
Спустя 3 минуты, 55 секунд (4.10.2009 - 16:16) Pinoplast написал(а):
Если б твин еще доплачивал для стимула чтоб решать я б писал , а так что не лежыт к душе то и не пишеться.
PS не люблю критики!!!
PS не люблю критики!!!
Спустя 2 минуты, 18 секунд (4.10.2009 - 16:18) Pinoplast написал(а):
Луше кошельки по ломать малость Я 41001404975488
PS Это шутка!!!
PS Это шутка!!!
Спустя 1 минута, 49 секунд (4.10.2009 - 16:20) Michael написал(а):
Та ладно, Pinoplast , не лежит душа - не надо - дело хозяйское.
А доплачивать - так это не twin уж точно должен...
А доплачивать - так это не twin уж точно должен...
Спустя 3 минуты, 50 секунд (4.10.2009 - 16:24) Pinoplast написал(а):
Мне интересно где Твини работаеш, судя потому что где то чтила то приподом по програмированию, или я неправ???
Спустя 2 минуты, 2 секунды (4.10.2009 - 16:26) glock18 написал(а):
Это интересный подход... типа стипендию тебе за обучение что ли платить?
Спустя 1 минута, 12 секунд (4.10.2009 - 16:27) Pinoplast написал(а):
Цитата (glock18 @ 4.10.2009 - 13:26) |
Это интересный подход... типа стипендию тебе за обучение что ли платить? |
да я так пошутил!!! хотя от стипухи в 1 wmz в месяц не отказался бы
Спустя 25 минут, 14 секунд (4.10.2009 - 16:52) twin написал(а):
Я готов платить за обучение.
Только не основам, а более серьёзным вещам. И платить я могу за реальную работу, если тот, кто учится, будет мне помогать решать коммерческие задачи. На сегодняшний день из тех, с кем я готов был бы иметь финансовые отношения, это как раз те люди, кто решил задачу. По крайней мере видно, что это люди, которые действительно хотят постичь азы и тонкости. И не жалеют на это ни сил ни времени.
А халявщикам от php - фу.
Только не основам, а более серьёзным вещам. И платить я могу за реальную работу, если тот, кто учится, будет мне помогать решать коммерческие задачи. На сегодняшний день из тех, с кем я готов был бы иметь финансовые отношения, это как раз те люди, кто решил задачу. По крайней мере видно, что это люди, которые действительно хотят постичь азы и тонкости. И не жалеют на это ни сил ни времени.
А халявщикам от php - фу.
Спустя 4 минуты, 3 секунды (4.10.2009 - 16:56) Pinoplast написал(а):
Твини то ты преподом работаеш или нет?
Спустя 48 минут, 21 секунда (4.10.2009 - 17:45) twin написал(а):
Я сам еще учусь. Просто у меня были хорошие преподы и я знаю как научить других)))
Спустя 19 минут, 35 секунд (4.10.2009 - 18:04) Pinoplast написал(а):
А где учишся если не сикрет?
Спустя 7 минут, 33 секунды (4.10.2009 - 18:12) twin написал(а):
У вас и учусь
Спустя 22 минуты, 3 секунды (4.10.2009 - 18:34) Pinoplast написал(а):
А серезно где учился или учишся колись!!!
Спустя 1 час, 55 минут, 52 секунды (4.10.2009 - 20:30) nemo написал(а):
Зделай перерыв! - Скушай Twin!
(Он все сделает за тебя )
(Он все сделает за тебя )
Спустя 1 год, 9 месяцев, 20 дней, 16 часов, 58 минут, 40 секунд (25.07.2011 - 13:28) 03x1 написал(а):
Щас попробую решить)
Спустя 38 минут, 13 секунд (25.07.2011 - 14:07) Raito-kun написал(а):
Цитата |
Щас попробую решить) |
отличный некропост. вспомнил свои начинания.
Спустя 5 месяцев, 2 дня, 1 час, 29 минут, 20 секунд (27.12.2011 - 15:36) Dagot написал(а):
Стиль кончено стремно читаемый