|
|
|
| Ответ 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($res, 0)))
: "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() ? 3: 4;
header("Location: http://$host$self?act=$err");
}
?>
|
http://www.softtime.ru/info/task.php?id_article=110 | |
|
|
|
|
|
|
|
для: SoftTime
(30.05.2007 в 23:43)
| | 1) 210 строк в двух файлах, читабельность не плохая, комментарии присутствуют.
2) успешно выполнено задание на обработку одиночных кавычек, как при вставке, так и при поиске.
3) Есть обработка ошибок SQL-запросов - хорошо.
4) Нет привязки к названию файла - хорошо.
5) Перед удалением пользователя спрашивает подтверждение - хорошо. | |
|
|
|
|
|
|
|
для: cheops
(01.06.2007 в 12:16)
| | Помниться в одном журнале был привиден тест. Так вот в результах (в зависимости от набраных баллов) было написано, что при 80 вы гений, а при 100 баллов вы "автор вопросов" :))))) | |
|
|
|
|
|
|
|
для: Artem S.
(01.06.2007 в 14:14)
| | Но он же с самог начала не собирался принимать участие... Так что у него был только плюс в том, что он уже когда-то представил себе всё это, но это не очень-то и сильный плюс ИМХО | |
|
|
|
|
|
|
|
для: Artem S.
(01.06.2007 в 14:14)
| | автор воппросов - безусловно. А "гения" могу отдать Вам. :)
У Вас очень хорошо структурирован код.
Вас не затруднит протестировать мой вариант?
В нем есть ошибки.
Ау! Последнее предложение касается всех! :) | |
|
|
|
|
|
|
|
для: Trianon
(01.06.2007 в 21:01)
| | Не, я не справился :)
Я протестирую, но вечером | |
|
|
|
|
|
|
|
для: Trianon
(01.06.2007 в 21:01)
| | >Вас не затруднит протестировать мой вариант?
>В нем есть ошибки.
Пока, не заметил. | |
|
|
|
|
|
|
|
для: sms-send
(03.06.2007 в 00:11)
| | ок. Два я назову сам.
Ввод пустого имени никак не контролируется.
Никак не контролируется ввод имени, которое невозможно поместить в поле таблицы из-за чрезмерной длины. | |
|
|
|
|
|
|
|
для: Trianon
(01.06.2007 в 21:01)
| | Ну он у вас не все имена принимает :) Если туда напихать кучу символов, то будут кое какие глюки ))) Если так можно выразиться... | |
|
|
|
|
|
|
|
для: DEM
(03.06.2007 в 00:15)
| | конкретнее, пожалуйста | |
|
|
|
|
|
|
|
для: Trianon
(03.06.2007 в 00:22)
| | Я уже и забыл какие :) Ща еще раз посомтрю ))) | |
|
|
|
|
|
|
|
для: DEM
(03.06.2007 в 00:26)
| | Ну если я не ошибаюсь, то вот какие:
\\ "
И еще вроде бы одинарные кавычки тоже... | |
|
|
|
|
|
|
|
для: DEM
(03.06.2007 в 01:36)
| | Trianon только не обижайся но в твоем скрипте есть пару уязвимостей
1)когда гость заходит на сайт в гет параметре ему присваевается id номер,получается ссылка вида ?act=1&id=10 если поменять id,то мы зайдем за другого человека)))
2)Кавычки у меня вроде все прошли,кроме пустого имени | |
|
|
|
|
|
|
|
для: ZAHTET
(03.06.2007 в 10:12)
| | 1)когда гость заходит на сайт в гет параметре ему присваевается id номер,получается ссылка вида ?act=1&id=10 если поменять id,то мы зайдем за другого человека)))
Задачи ставить пароли не стояло. | |
|
|
|
|
|
|
|
для: Unkind
(03.06.2007 в 11:03)
| | При чем тут пароли? | |
|
|
|
|
|
|
|
для: ZAHTET
(03.06.2007 в 11:15)
| | Любой человек может зайти от любого имени. В задаче не говорилось про какие-либо ограничения на этот счёт. | |
|
|
|
|
|
|
|
для: sms-send
(03.06.2007 в 13:23)
| | НУ да!В задаче еще не говорилось что нужно проверять строку на наличие кавычек,а потом как выяснилось стали претензии к этому! | |
|
|
|
|
|
|
|
для: ZAHTET
(03.06.2007 в 13:41)
| | В задаче говорилось, что имя может состоять из ЛЮБЫХ символов. А для корректного ввода в БД необходима и проверка на кавычки... Как я понял | |
|
|
|
|
|
|
|
для: victoor
(03.06.2007 в 14:20)
| | Да верно,просто люди подумали что не нужно текст обрабатывать | |
|
|
|
|
|
|
|
для: ZAHTET
(03.06.2007 в 14:48)
| | А текст нужно обрабатывать всегда. И не для защиты от уязвимостей, а просто для того, чтобы текст во всех примененных представлениях оставался текстом, а не разваливался на куски.
Правда, в таком случае появится стойкость скрипта к некоторым весьма распространенным атакам - но это эффект побочный, а не прямой. Другими словами, если Вы корректно пишете скрипт, заботясь о том, чтобы он правильно обрабатывал любые текстовые данные - безопасность (эта самая пресловутая безопасность, по которой возникает львиная доля вопросов) обеспечивается сама собой. Если не вся - то изрядная часть её.
Собственно, для продвижения этого тезиса я эту задачу и придумал. | |
|
|
|
|
|
|
|
для: ZAHTET
(03.06.2007 в 11:15)
| | При чем тут пароли?
Пароли - это такая вещь, которая позволяет защитить какое-то содержимое от несанкционированного доступа. В данном случае доступ к странице, где пишут "Здравствуйте, {username}! В Вашем имени {length} символов. Вы зашли к нам в {visits}-й раз.". | |
|
|
|
|
|
|
|
для: ZAHTET
(03.06.2007 в 10:12)
| | Главное, не обижайтесь Вы, а я уж как-нибудь переживу :))
1. Нам проще зайти просто написав имя этого человека в форме, не так ли?
2. Кавычки прошли и у меня. В чем тут уязвимость? | |
|
|
|
|
|
|
|
для: DEM
(03.06.2007 в 01:36)
| | Как насчет скриншота? | |
|
|
|
|
|
|
|
для: DEM
(03.06.2007 в 01:36)
| | Изготовлю на заказ скриншоты любой сложности. Недорого. | |
|
|
|
|
|
|
|
для: kasmanaft
(04.06.2007 в 10:17)
| | ))) | |
|
|
|
|
|
|
|
для: sms-send
(04.06.2007 в 10:36)
| | Коля пиши на мыло, с тебя еще онлайн игра договор есть договор, иль кинул? Я тебе деньги заплатил как и обещал слово есть слово. Не хочестя тебя искать, но в противном случае извени. Диск я думаю тоже нужно вернуть. Я тебе еще 3500 тыс доплачиваю и ты реализуешь проект. Пиши на мыло я не кусаюся. Кидать только не советую, не с тем связался это не прощается. Вот тел. на крайняк +79047943728 найти знаешь как меня. | |
|
|
|
|
|
|
|
для: Санька
(02.12.2007 в 18:39)
| | О да, Вы решили на форуме отношения выяснять?, Санька ты уверен что это тот человек кто тебе нужен? Да еще в задачах на PHP | |
|
|
|