|
|
|
| С условиями задачи можно ознакомится по 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_user, MYSQL_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_visits, MYSQL_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:34)
| | Функцию подтверждения яваскриптом взял из соседней темы, потому как сам с ним не особо дружу. Уж не обессудьте =) | |
|
|
|
|
|
|
|
для: man1
(31.01.2009 в 21:34)
| | неплохо, но огрехи есть.
В частности, в условии задачи специально оговаривалось, что процесс поиска пользователя должен
а) проходить по имени , а не по id, и
б) выполняться одним и тем же обработчиком, что из ссылки таблицы, что из формы поиска.
Этот, на первый взгляд, нарочитый пункт позволял проверить, умеете ли Вы формировать корректные ссылки с произвольными текстовыми параметрами.
Ну и трюк с strlen($my_info['guestname']) ... в пределах допустимого, конечно.
Но опять же, в идеале было бы посчитать это значение прямо по входному параметру.
Да и само приветствие по входному параметру сформировать.
Но повторюсь, в целом - неплохо. | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2009 в 23:09)
| | код красиво написан. я такой видел в файлах phpbb форумов..
а вот строки
$dbnx = mysql_connect($host, $uname, $upass) or die("Не удается соединиться с MySql сервером. Проверьте конфигурационный файл.");
$seldb = mysql_select_db($db, $dbnx) or die("Заданныя БД не доступна. Проверьте конфиггурационный файл.");
это типо вместо условия ? | |
|
|
|
|
|
|
|
для: reda
(01.03.2009 в 05:15)
| | В принципе да, если соединение с БД по каким-то причинам установить не удается или заданная БД недоступна по каким-то причинам, то код дальше выполняться не будет. | |
|
|
|