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

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

 

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

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

тема: Ответ 007 на задачу N 21.
 
 автор: man1   (31.01.2009 в 21:34)   письмо автору
 
 

С условиями задачи можно ознакомится по http://softtime.ru/info/task.php?id_article=110.

Решение состоит из 4-х файлов: config.php (коннект к БД и несколько шаблонов для index.php), handler.php (обработчик), functions.php (функции для обработчика) и index.php. Прошу оценить всех сие и проверить на уязвимости )

config.php

<?
//---------------------------------------------

$uname "";
$upass "";
$host "";
$db "";

# Скрипт - обработчик действий.
$action_script 'handler.php';

//---------------------------------------------

include "functions.php";

# Переменные
$do $_REQUEST['do'];
$id intval($_GET['id']);


$dbnx mysql_connect($host$uname$upass) or die("Не удается соединиться с MySql сервером. Проверьте конфигурационный файл.");
$seldb mysql_select_db($db$dbnx) or die("Заданныя БД не доступна. Проверьте конфиггурационный файл.");

# Различные шаблоны :)
DEFINE(_TABLE_NAME"<tr><td>N</td><td>Гость</td><td>визит</td><td>x</td></tr>");
DEFINE(_TABLE_TOP"<table align='center'>");
DEFINE(_TABLE_FOOTER"</table>");
DEFINE(_SEARCH_FORM"<br>
<table align='center'>
<form action='"
.$action_script."' method='get'>
<input type='hidden' name='do' value='find'>
<tr><td>Логин: <input type='text' name='name'></td></tr>
<tr><td><input type='submit' value='Найти'></td></tr>
</form>
</table>
"
);
DEFINE(_REG_FORM"
<table align='center'><br>
<form action='"
.$action_script."' method='post'>
<input type='hidden' name='do' value='reg'>
<tr><td>Логин: <input type='text' name='name'></td></tr>
<tr><td><input type='submit' value='Зарегистрироваться'></td></tr>
</form>
</table>
"
);        
//---------------------------------------------
?>


handler.php

<?
session_start
();
include_once 
"config.php";

#echo "Выбранные параметры: ".$do." - ".$id. " - ".$name;

/*
handler.php. Скрипт - обработчик действий.
*/


# Обрабатываем действие на удаление юзера из БД
if($do == 'del') {
if(
del_user($id$dbnx) == true) echo "Пользователь удален.";
else echo 
"Ошибка при удалении пользователя";

}

# Обрабатываем действие на поиск юзера в БД
elseif($do == 'find') {

$name my_protect($_GET['name']);

$sel_user mysql_query("SELECT * FROM guests WHERE guestname = '$name'"$dbnx);

if(
mysql_num_rows($sel_user) >= '1') { 

$num 0;

echo 
_TABLE_TOP;
echo 
_TABLE_NAME;
while(
$user mysql_fetch_array($sel_userMYSQL_ASSOC)) {

$num++;

echo 
"<tr><td>".$num."</td><td>".htmlspecialchars($user['guestname'])."</td><td>".$user['visits']."</td><td><a href='".$action_script."?do=del&id=".intval($user['id'])."'>del</a></td></tr>";

}
echo 
_TABLE_FOOTER;

}
else echo 
'Выбранный Вами пользователь отсутствует в БД.';

}


elseif(
$do == 'reg') {

if(
reg_user($name$dbnx) == true) echo 'Спасибо за регистрацию, Ваш аккаунт добавлен в общую БД пользователей.';
else echo 
'Ошибка при регистрации нового пользователя!';

}

else echo 
"Действие не задано.";


?>


functions.php

<?

# Функция проверки на магические кавычки.
function my_protect($my_str) {

if(!
get_magic_quotes_gpc()) $my_str mysql_escape_string($my_str); 

return 
$my_str;

}

# Функция удаления пользователя из БД.
function del_user($id$resource) {

$del_query mysql_query("DELETE FROM guests WHERE id = '$id'"$resource);
if(
$del_query$msg true;
else 
$msg false;

return 
$msg;

}

# Функция регистрации пользователя или обновления кол-ва его посещений в случае его существования в БД.

function reg_user($name$resource) {

$_SESSION['name'] = my_protect($_POST['name']);
$name $_SESSION['name'];

$is_in_db mysql_num_rows(mysql_query("SELECT * FROM guests WHERE guestname = '$name'"$resource));

if(
$is_in_db >= '1'$reg_query mysql_query("UPDATE guests SET visits = visits + 1 WHERE guestname = '$name'"$resource);
else 
$reg_query mysql_query("INSERT INTO guests (guestname, visits) VALUES ('$name', '0')"$resource);

if(
$reg_query$msg true;
else 
$msg false;

return 
$msg;

}

# Функция обновления счетчика посещений для пользователя.

function counter_update($name$resource) {

$name my_protect($name);

$is_in_db mysql_num_rows(mysql_query("SELECT * FROM guests WHERE guestname = '$name'"$resource));

if(
$is_in_db >= '1'$reg_query mysql_query("UPDATE guests SET visits = visits + 1 WHERE guestname = '$name'"$resource);

if(
$reg_query$msg true;
else 
$msg false;

return 
$msg;

}

# Функция сообщения-приветстия.

function my_welcome_table($name$resource) {

$name my_protect($name);

$sel_visits mysql_query("SELECT * FROM guests WHERE guestname = '$name'"$resource);

if(
mysql_num_rows($sel_visits) >= '1') {

$my_info mysql_fetch_array($sel_visitsMYSQL_ASSOC);

$table .= "<tr><td>Привет, ".htmlspecialchars($my_info['guestname'])."! Вы знаете, что в Вашем имени ".strlen($my_info['guestname'])." символов?</td></tr>";
$table .= "<tr><td>Нас уже посетили: ".$my_info['visits']."</td></tr>";
}
else {
$table .= "<tr><td>Привет, Гость! Вы знаете, что в Вашем имени ".strlen("Гость")." символов?</td></tr>";
$table .= "<tr><td>Нас уже посетили: </td></tr>";

}

return 
$table;

}

function 
del_confirm($action_script) {

 
$str "<script>
            function delstr (name, id)
                {
                if (confirm(name + '! Вы действительно хотите вычеркнуть этого гостя?'))
                    window.location='"
.$action_script."?do=del&id=' + id;
                else return false;
                }
        </script>"
;
        
return 
$str;

}

?>


index.php

<?
session_start
();
include 
"config.php";

# Если пользователь уже зарегистрирован, то обновляем счетчик его посещений на странице.
counter_update($name$dbnx);
echo 
del_confirm($action_script);

# Запрос на выбор всех зерегистрированных пользователей из БД ...
$sel_user mysql_query("SELECT * FROM guests");

# Шаблон верха столбца (см. config.php)
echo _TABLE_TOP;

# Сообщение-приветствие (см. functions.php)
echo my_welcome_table($name$dbnx);

# Шаблон низа столбца (см. config.php)
echo _TABLE_FOOTER

echo 
_TABLE_TOP;

# Шаблон названия столбцов (см. config.php)
echo _TABLE_NAME;

# Задаем начальное значение для счетчика-нумератора строк.
$num '1';

# ... сам выбор пользователей в цикле

while($user mysql_fetch_array($sel_user)) {

echo 
"<tr><td>".$num++."</td><td><a href='".$action_script."?do=find&id=".intval($user['id'])."'>".htmlspecialchars($user['guestname'])."</td><td>".$user['visits']."</td><td><a href='#' onclick='delstr(\"".htmlspecialchars($user['guestname'], ENT_QUOTES)."\", ".intval($user['id']).")'>del</a></td></tr>";

}

# Шаблон низа столбца
echo _TABLE_FOOTER;

# Форма поиска (см. config.php)
echo _SEARCH_FORM;
# Форма регистрации (см. config.php)
echo _REG_FORM;

?>

  Ответить  
 
 автор: man1   (31.01.2009 в 21:37)   письмо автору
 
   для: man1   (31.01.2009 в 21:34)
 

Функцию подтверждения яваскриптом взял из соседней темы, потому как сам с ним не особо дружу. Уж не обессудьте =)

  Ответить  
 
 автор: Trianon   (31.01.2009 в 23:09)   письмо автору
 
   для: man1   (31.01.2009 в 21:34)
 

неплохо, но огрехи есть.
В частности, в условии задачи специально оговаривалось, что процесс поиска пользователя должен
а) проходить по имени , а не по id, и
б) выполняться одним и тем же обработчиком, что из ссылки таблицы, что из формы поиска.

Этот, на первый взгляд, нарочитый пункт позволял проверить, умеете ли Вы формировать корректные ссылки с произвольными текстовыми параметрами.

Ну и трюк с strlen($my_info['guestname']) ... в пределах допустимого, конечно.
Но опять же, в идеале было бы посчитать это значение прямо по входному параметру.
Да и само приветствие по входному параметру сформировать.
Но повторюсь, в целом - неплохо.

  Ответить  
 
 автор: reda   (01.03.2009 в 05:15)   письмо автору
 
   для: Trianon   (31.01.2009 в 23:09)
 

код красиво написан. я такой видел в файлах phpbb форумов..


а вот строки
$dbnx = mysql_connect($host, $uname, $upass) or die("Не удается соединиться с MySql сервером. Проверьте конфигурационный файл.");
$seldb = mysql_select_db($db, $dbnx) or die("Заданныя БД не доступна. Проверьте конфиггурационный файл.");
это типо вместо условия ?

  Ответить  
 
 автор: man1   (09.03.2009 в 20:32)   письмо автору
 
   для: reda   (01.03.2009 в 05:15)
 

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

  Ответить  
Rambler's Top100
вверх

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