Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 005 на задачу N 21
 
 автор: SoftTime   (30.05.2007 в 23:43)   письмо автору
 
 

Ответ 005 на задачу N 21.
С условиями задачи можно ознакомится по ссылке.

<?php  // таблица гостей    | Trianon |
include('config.inc.php'); // установление соединения с БД.

//---- несколько вспомогательных функций ----

// восстановление испорченных входных параметров
// (на случай, если на хосте включен magic_quotes_gpc)
function unmq($arg)
{
    return 
$arg === null null :
              (
get_magic_quotes_gpc()? stripslashes($arg): $arg);
}

// вывод заголовка (стиль, JS-код)
function head()
{
 
?>
 <html><head><style>
table {border-collapse: collapse;}
td,th { border: 1px solid #666666; align: center }
</style>
    <script type=text/javascript>
  function del(name, id)
  {
    window.location.href =
      confirm(name+'! Вы действительно хотите удалить себя из списка?')
      ? '?del='+id :  document.location.href+'#';
  }
</script></head><body bgcolor=#AABBCC>
 <?
}

// вывод подножия (форма поиска и две ссылки навигации)
function tail()
{
 
?>
 <hr>
 <form method=get action=? >
  Поиск имени: <input name=name />
            <input type=submit value=Найти />
  </form>
 <hr>
  <a href=?> Новый визит</a>
  <a href=?act=2>Список всех имен</a>
<?

}

// ------- начало кода --------------
// берем входные параметры
   
$add   unmq(@$_POST['name']);  // имя посетителя при визите
   
$src   unmq(@$_GET ['name']);  // имя посетителя при поиске
   
$del   intval(@$_GET ['del']); // id удаляемого посетителя
   
$act   intval(@$_GET ['act']); // ветвь редиректа
   
$id    intval(@$_GET ['id']);  // id посетителя при редиректе

   
if($add === null && $src === null && !$act && !$del)
   {   
// случай начального запуска - без параметров
       
head();
       
?> <form method=post action=? >
          Ваше имя: <input name=name />
                    <input type=submit value=Enter />
          </form>
       <?
       tail
();
   }elseif(
$add !== null)
   {   
// обработка данных формы учета визита посетителя.
       
$host $_SERVER['HTTP_HOST'];
       
$self $_SERVER['PHP_SELF'];
       
$enc_add rawurlencode($add);
       
$name $add;
       
$esc_name "'".mysql_escape_string($name)."'";
       
$sql "SELECT id FROM guests WHERE guestname = $esc_name";
       
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
       
$id false;
       
$sql mysql_num_rows($res)
            ? 
"UPDATE guests SET visits = visits + 1 WHERE id = ".($id=intval(mysql_result($res0)))
            : 
"INSERT INTO guests (guestname, visits) VALUES ($esc_name, 1)";
       
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
       if(!
$id)  $id mysql_insert_id();
       
header("Location: http://$host$self?act=1&id=$id");
       exit(
"Данные приняты.");
   }else if(
$act)
   {   
// обработка запроса всего списка и обработка редиректов
       // (для убирания побочных эффектов при обновлении
       // страниц после активных действий)
       
head();
       if(
$act == 1)
       {   
// редирект после учета добавления посетителя
         
$sql "SELECT *, LENGTH(guestname) as len FROM guests WHERE id = ".intval($id);
         
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
         if(!
mysql_num_rows($res))
             echo 
"Ощибка добавления посетителя";
         else
         {
           
$row=mysql_fetch_assoc($res);
           
$visits intval($row['visits']);
           
$name $row['guestname'];
           
$len intval($row['len']);
           
$out_name htmlspecialchars($name);
           echo 
"Здравствуйте, $out_name! В Вашем имени $len символов<br/>\r\n";
           echo 
"Вы зашли к нам $visits-й раз.<br/>\r\n";
         }
       }
       if(
$act <= 2)
       {   
// редирект после учета добавления посетителя
           // и обработка запроса всего списка посетителей
           
echo "<hr>Нас посетили:<table><tr><th> N </th><th> Посетитель </th>
             <th> Визит </th><th> x </th><tr>\r\n"
;

           
$sql "SELECT * FROM guests";
           
$res mysql_query($sql) or die("Error in $sql: "mysql_error());

           for(
$n 1$row=mysql_fetch_assoc($res); $n++)
           {
               
$id $row['id'];
               
$guestname $row['guestname'];
               
$visits $row['visits'];

               
$enc rawurlencode($guestname);
               
$out_name htmlspecialchars($guestname);
               
$out_enc htmlspecialchars($enc);
               
$js_name mysql_escape_string($guestname);
               
$out_js_name htmlspecialchars($js_name);
               echo 
"<tr>
                 <td> 
$n </td>
                 <td> <a href=\"?name=
$out_enc\" >$out_name</a> </td>
                 <td> 
$visits </td>
                 <td> <a href=\"#\" onClick=\"javascript:del('
$out_js_name', $id);\">del</a> </td><tr>\r\n";
           }
           echo 
"</table>\r\n";
       }else
       {   
// редирект при удалении посетителя
           
echo $act == 3?"Посетитель удален":"Нет такого посетителя";
       }
       
tail();
   }elseif(
$src !== null)
   {   
// обработка запроса поиска
       
$esc_name "'".mysql_escape_string($src)."'";
       
$out_name htmlspecialchars($src);
       
$sql "SELECT * FROM guests WHERE guestname = $esc_name";
       
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
       if(
mysql_num_rows($res) == 0)
       {
           
head();
           echo 
"Однако, $out_name нас не посещал";
           
tail();
       }
       else
       {
           
head();
           echo 
"<hr>Результат поиска:<table><tr><th> N </th><th> Посетитель </th>
                 <th> Визит </th><th> x </th><tr>\r\n"
;

         for(
$n 1$row=mysql_fetch_assoc($res); $n++)
         {
           
$id $row['id'];
           
$guestname $row['guestname'];
           
$visits $row['visits'];

           
$enc rawurlencode($guestname);
           
$out_name htmlspecialchars($guestname);
           
$out_enc htmlspecialchars($enc);
           
$js_name mysql_escape_string($guestname);
           
$out_js_name htmlspecialchars($js_name);
           echo 
"<tr>
             <td> 
$n </td>
             <td> <a href=\"?name=
$out_enc\" >$out_name</a> </td>
             <td> 
$visits </td>
             <td> <a href=\"#\" onClick=\"javascript:del('
$out_js_name', $id);\">del</a> </td><tr>\r\n";
         }
         echo 
"</table>\r\n";
         
tail();
       }
   }elseif(
$del !== null)
   {   
// обработка запроса удаления посетителя
       
$sql "DELETE FROM guests WHERE id = ".intval($del);
       
$res mysql_query($sql) or die("Error in $sql: "mysql_error());
       
$host $_SERVER['HTTP_HOST'];
       
$self $_SERVER['PHP_SELF'];
       
$err mysql_affected_rows() ? 34;
       
header("Location: http://$host$self?act=$err");
   }
?>



http://www.softtime.ru/info/task.php?id_article=110

   
 
 автор: cheops   (01.06.2007 в 12:16)   письмо автору
 
   для: SoftTime   (30.05.2007 в 23:43)
 

1) 210 строк в двух файлах, читабельность не плохая, комментарии присутствуют.
2) успешно выполнено задание на обработку одиночных кавычек, как при вставке, так и при поиске.
3) Есть обработка ошибок SQL-запросов - хорошо.
4) Нет привязки к названию файла - хорошо.
5) Перед удалением пользователя спрашивает подтверждение - хорошо.

   
 
 автор: Artem S.   (01.06.2007 в 14:14)   письмо автору
 
   для: cheops   (01.06.2007 в 12:16)
 

Помниться в одном журнале был привиден тест. Так вот в результах (в зависимости от набраных баллов) было написано, что при 80 вы гений, а при 100 баллов вы "автор вопросов" :)))))

   
 
 автор: DEM   (01.06.2007 в 16:32)   письмо автору
 
   для: Artem S.   (01.06.2007 в 14:14)
 

Но он же с самог начала не собирался принимать участие... Так что у него был только плюс в том, что он уже когда-то представил себе всё это, но это не очень-то и сильный плюс ИМХО

   
 
 автор: Trianon   (01.06.2007 в 21:01)   письмо автору
 
   для: Artem S.   (01.06.2007 в 14:14)
 

автор воппросов - безусловно. А "гения" могу отдать Вам. :)
У Вас очень хорошо структурирован код.

Вас не затруднит протестировать мой вариант?
В нем есть ошибки.

Ау! Последнее предложение касается всех! :)

   
 
 автор: Artem S.   (02.06.2007 в 11:35)   письмо автору
 
   для: Trianon   (01.06.2007 в 21:01)
 

Не, я не справился :)
Я протестирую, но вечером

   
 
 автор: sms-send   (03.06.2007 в 00:11)   письмо автору
 
   для: Trianon   (01.06.2007 в 21:01)
 

>Вас не затруднит протестировать мой вариант?
>В нем есть ошибки.

Пока, не заметил.

   
 
 автор: Trianon   (03.06.2007 в 00:25)   письмо автору
 
   для: sms-send   (03.06.2007 в 00:11)
 

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

   
 
 автор: DEM   (03.06.2007 в 00:15)   письмо автору
 
   для: Trianon   (01.06.2007 в 21:01)
 

Ну он у вас не все имена принимает :) Если туда напихать кучу символов, то будут кое какие глюки ))) Если так можно выразиться...

   
 
 автор: Trianon   (03.06.2007 в 00:22)   письмо автору
 
   для: DEM   (03.06.2007 в 00:15)
 

конкретнее, пожалуйста

   
 
 автор: DEM   (03.06.2007 в 00:26)   письмо автору
 
   для: Trianon   (03.06.2007 в 00:22)
 

Я уже и забыл какие :) Ща еще раз посомтрю )))

   
 
 автор: DEM   (03.06.2007 в 01:36)   письмо автору
 
   для: DEM   (03.06.2007 в 00:26)
 

Ну если я не ошибаюсь, то вот какие:
\\ "
И еще вроде бы одинарные кавычки тоже...

   
 
 автор: ZAHTET   (03.06.2007 в 10:12)   письмо автору
 
   для: DEM   (03.06.2007 в 01:36)
 

Trianon только не обижайся но в твоем скрипте есть пару уязвимостей
1)когда гость заходит на сайт в гет параметре ему присваевается id номер,получается ссылка вида ?act=1&id=10 если поменять id,то мы зайдем за другого человека)))
2)Кавычки у меня вроде все прошли,кроме пустого имени

   
 
 автор: Unkind   (03.06.2007 в 11:03)   письмо автору
 
   для: ZAHTET   (03.06.2007 в 10:12)
 

1)когда гость заходит на сайт в гет параметре ему присваевается id номер,получается ссылка вида ?act=1&id=10 если поменять id,то мы зайдем за другого человека)))
Задачи ставить пароли не стояло.

   
 
 автор: ZAHTET   (03.06.2007 в 11:15)   письмо автору
 
   для: Unkind   (03.06.2007 в 11:03)
 

При чем тут пароли?

   
 
 автор: sms-send   (03.06.2007 в 13:23)   письмо автору
 
   для: ZAHTET   (03.06.2007 в 11:15)
 

Любой человек может зайти от любого имени. В задаче не говорилось про какие-либо ограничения на этот счёт.

   
 
 автор: ZAHTET   (03.06.2007 в 13:41)   письмо автору
 
   для: sms-send   (03.06.2007 в 13:23)
 

НУ да!В задаче еще не говорилось что нужно проверять строку на наличие кавычек,а потом как выяснилось стали претензии к этому!

   
 
 автор: victoor   (03.06.2007 в 14:20)   письмо автору
 
   для: ZAHTET   (03.06.2007 в 13:41)
 

В задаче говорилось, что имя может состоять из ЛЮБЫХ символов. А для корректного ввода в БД необходима и проверка на кавычки... Как я понял

   
 
 автор: ZAHTET   (03.06.2007 в 14:48)   письмо автору
 
   для: victoor   (03.06.2007 в 14:20)
 

Да верно,просто люди подумали что не нужно текст обрабатывать

   
 
 автор: Trianon   (04.06.2007 в 10:00)   письмо автору
 
   для: ZAHTET   (03.06.2007 в 14:48)
 

А текст нужно обрабатывать всегда. И не для защиты от уязвимостей, а просто для того, чтобы текст во всех примененных представлениях оставался текстом, а не разваливался на куски.
Правда, в таком случае появится стойкость скрипта к некоторым весьма распространенным атакам - но это эффект побочный, а не прямой. Другими словами, если Вы корректно пишете скрипт, заботясь о том, чтобы он правильно обрабатывал любые текстовые данные - безопасность (эта самая пресловутая безопасность, по которой возникает львиная доля вопросов) обеспечивается сама собой. Если не вся - то изрядная часть её.

Собственно, для продвижения этого тезиса я эту задачу и придумал.

   
 
 автор: Unkind   (03.06.2007 в 15:41)   письмо автору
 
   для: ZAHTET   (03.06.2007 в 11:15)
 

При чем тут пароли?
Пароли - это такая вещь, которая позволяет защитить какое-то содержимое от несанкционированного доступа. В данном случае доступ к странице, где пишут "Здравствуйте, {username}! В Вашем имени {length} символов. Вы зашли к нам в {visits}-й раз.".

   
 
 автор: Trianon   (04.06.2007 в 09:57)   письмо автору
 
   для: ZAHTET   (03.06.2007 в 10:12)
 

Главное, не обижайтесь Вы, а я уж как-нибудь переживу :))

1. Нам проще зайти просто написав имя этого человека в форме, не так ли?

2. Кавычки прошли и у меня. В чем тут уязвимость?

   
 
 автор: Trianon   (04.06.2007 в 09:53)   письмо автору
 
   для: DEM   (03.06.2007 в 01:36)
 

Как насчет скриншота?

   
 
 автор: kasmanaft   (04.06.2007 в 10:17)   письмо автору
 
   для: DEM   (03.06.2007 в 01:36)
 

Изготовлю на заказ скриншоты любой сложности. Недорого.

   
 
 автор: sms-send   (04.06.2007 в 10:36)   письмо автору
 
   для: kasmanaft   (04.06.2007 в 10:17)
 

)))

   
 
 автор: Санька   (02.12.2007 в 18:39)   письмо автору
 
   для: sms-send   (04.06.2007 в 10:36)
 

Коля пиши на мыло, с тебя еще онлайн игра договор есть договор, иль кинул? Я тебе деньги заплатил как и обещал слово есть слово. Не хочестя тебя искать, но в противном случае извени. Диск я думаю тоже нужно вернуть. Я тебе еще 3500 тыс доплачиваю и ты реализуешь проект. Пиши на мыло я не кусаюся. Кидать только не советую, не с тем связался это не прощается. Вот тел. на крайняк +79047943728 найти знаешь как меня.

   
 
 автор: Faraon   (02.12.2007 в 22:09)   письмо автору
 
   для: Санька   (02.12.2007 в 18:39)
 

О да, Вы решили на форуме отношения выяснять?, Санька ты уверен что это тот человек кто тебе нужен? Да еще в задачах на PHP

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования