Сразу признаюсь, что функцию stripslashesDeep честно скомуниздил из разработок IRBIS-team, ибо не придумал более изящного решения.
index.php
<?php
header("Content-Type: text/html; charset=utf-8"); // отправляем заголовок с кодировкой
error_reporting(E_ALL); // просим показать все ошибки
/**
* We kill magic inverted commas
* Убиваем магические кавычки
*/
function stripslashesDeep($data)
{
if(is_array($data))
$data = array_map("stripslashesDeep", $data);
else
$data = stripslashes($data);
return $data;
}
if(get_magic_quotes_gpc())
{
$_GET = stripslashesDeep($_GET);
$_POST = stripslashesDeep($_POST);
$_COOKIE = stripslashesDeep($_COOKIE);
}
////////////////////////////////////////////////////////////////
//////// параметры соединения с БД /////////
////////////////////////////////////////////////////////////////
$connect = mysql_connect ('localhost', 'root', '') or die ('ошибка подключения к серверу БД: <br>' . mysql_error());
mysql_select_db ('names', $connect) or die ('ошибка подключения к БД: <br>' . mysql_error());
mysql_query ('SET NAMES utf8');
mysql_query ('SET CHARACTER SET utf8');
mysql_query ('SET COLLATION_CONNECTION="utf8_general_ci"');
////////////////////////////////////////////////////////////////
//////// обработка данных регистрации /////////
////////////////////////////////////////////////////////////////
if (isset ($_POST['reg']))
{
$login = (string) trim ($_POST['login']);
if (!empty ($login) || $login === '0')
{
$result = mysql_query ("INSERT
INTO `names`
VALUES (
NULL,
NOW(),
'". mysql_real_escape_string ($login) ."'
)
");
}
// сбросим данные $_POST, перенаправив браузер
header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
}
////////////////////////////////////////////////////////////////
//////// обработка данных поиска /////////
////////////////////////////////////////////////////////////////
$search_list = '<ul>';
$search = '';
if (isset ($_GET['find']))
{
$search = $_GET['search_login'];
$result = mysql_query ("SELECT `name`
FROM `names`
WHERE `name`
LIKE '%". mysql_real_escape_string (addCslashes ($search, '_%\\')) ."%'
");
while ($user = mysql_fetch_row($result))
$search_list .= '<li>' . htmlspecialchars ($user[0]) . '</li>';
$search_list .= '</ul>';
}
////////////////////////////////////////////////////////////////
//////// дата регистрации пользователя /////////
////////////////////////////////////////////////////////////////
$info = '';
if (isset ($_GET['id']))
{
$result = mysql_query ("SELECT *
FROM `names`
WHERE `id` = ". intval ($_GET['id'])
);
if ($result)
{
$user = mysql_fetch_row($result);
$info = 'Дата регистрации пользователя <b>'. htmlspecialchars ($user[2]) . '</b>: ' . htmlspecialchars ($user[1]);
}
}
////////////////////////////////////////////////////////////////
//////// составление списка пользователей /////////
////////////////////////////////////////////////////////////////
$users_list = '<ul>';
$result = mysql_query ("SELECT *
FROM `names`
ORDER by `id` DESC
");
while ($user = mysql_fetch_assoc ($result))
{
$login = (!empty ($user['name']) || $user['name'] === '0') ? htmlspecialchars ($user['name']) : '';
$users_list .= '<li><a href = "index.php?id=' . htmlspecialchars ($user['id']) . '">' . $login . '</a></li>';
}
$users_list .= '</ul>';
include './index.tpl'; // подключаем шаблон
index.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>задачка от twin'а</title>
</head>
<body>
<p align = "left">
<?php echo $info ?>
</p>
<form action="" method = "post">
<p align = "left">
<input type = "text" name = "login"/>
<input type = "submit" name = "reg" value = "зарегистрироваться"/>
</p>
</form>
<form action="" method = "get">
<p align = "left">
<input type = "text" name = "search_login" value = "<?php echo htmlspecialchars ($search) ?>" />
<input type = "submit" name = "find" value = "искать!"/>
</p>
</form>
<p align = "left">
<?php echo $search_list ?>
</p>
<p>
<?php echo $users_list ?>
</p>
</body>
</html>
Линчуйте

Спустя 44 минуты, 6 секунд (26.10.2010 - 18:47) twin написал(а):
Ну что могу сказать... Практически идеально.
Два малюююсеньких замечания.
1. Вот тут
2. В редиректе у тебя текущий файл, это гут. Тоесть скрипт не привязан к файлу и может быть помещен куда угодно.
А вот это место
А больше и придраться не к чиму.
Круто, поздравляю.
Два малюююсеньких замечания.
1. Вот тут
$login = (string) trim ($_POST['login']);приведение типов лишнее. В массиве POST всегда тип string бывает. А вот обращение к несуществующему элементу вполне возможно. Туда лучше уж собачку было бы.
2. В редиректе у тебя текущий файл, это гут. Тоесть скрипт не привязан к файлу и может быть помещен куда угодно.
А вот это место
$users_list .= '<li><a href = "index.php?id=' . htmlspecialchars ($user['id']) . '">' . $login . '</a></li>';сводит на нет это благое начинание. Тогда уж так надо:
$users_list .= '<li><a href = "?id=' . htmlspecialchars ($user['id']) . '">' . $login . '</a></li>';
А больше и придраться не к чиму.
Круто, поздравляю.

Спустя 2 часа, 46 минут, 16 секунд (26.10.2010 - 21:33) ShamanV написал(а):
Цитата (twin @ 26.10.2010 - 15:47) |
приведение типов лишнее. В массиве POST всегда тип string бывает. А вот обращение к несуществующему элементу вполне возможно. Туда лучше уж собачку было бы. |
Забыл убрать, все равно оно мне не помогло. Несколько смутил тот факт, что '0' считается пустой строкой. Ведь по идее здесь это просто символ и само его наличие уже говорит о том, что строка не пустая....
С этого дня больше не буду пользоваться табуляцией при форматировании. Все, что так красиво выглядело в эклипсе, поплыло после вставки в форум.
Спасибо за отличную задачу и замечания. Приятно, что понял суть правильно.
Вот скажите, если следовать этому методу, то есть гарантия защиты от xss и sql-inj? Очень уж часто натыкаюсь на утверждение, что необходимо выжигать каленым железом все "плохие символы", люди целые талмуды пишут на эту тему (и не только Фленов)

Спустя 14 часов, 31 минута, 44 секунды (27.10.2010 - 12:05) twin написал(а):
Цитата |
Очень уж часто натыкаюсь на утверждение, что необходимо выжигать каленым железом все "плохие символы", люди целые талмуды пишут на эту тему (и не только Фленов) |
Ну это утверждают параноики, или недалекие люди, начитавшиеся фленова. Символы не бывают "плохими". Они все хорошие. Нужно просто уметь их готовить.
Разве стали бы использовать в спецификациях опасные символы? Смешно право.
Есть опасные комбинации символов, вот с ними нужно бороться. И не в коем случае не фильтрацией. Только правильной обработкой.
Если суть уловил - ничего дальше не страшно. И не слушай никого.
Спустя 13 минут, 1 секунда (27.10.2010 - 12:18) DedMorozzz написал(а):
Цитата |
С этого дня больше не буду пользоваться табуляцией при форматировании. Все, что так красиво выглядело в эклипсе, поплыло после вставки в форум. |
Зря. Пользуйся. Так наааамного удобней. Просто "потом" скопируй результат табуляции и замени все символы табуляции на 4 пробела, по всему документу. Минутное дело.
Спустя 8 минут, 17 секунд (27.10.2010 - 12:26) twin написал(а):
Вот тут приблуда есть для этого кстати.
Спустя 35 минут, 54 секунды (27.10.2010 - 13:02) ShamanV написал(а):
Спс, приблуду видел
У меня еще проблема в том, что в части кода отступы реализованы пробелами. Например, в участках, взятых из ваших листингов. Хотя, если там 4 пробела, должно все получиться. Безусловно, табуляция удобна

У меня еще проблема в том, что в части кода отступы реализованы пробелами. Например, в участках, взятых из ваших листингов. Хотя, если там 4 пробела, должно все получиться. Безусловно, табуляция удобна
