[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Задача на корректную обработку данных
ShamanV
Условия задачи здесь.

Сразу признаюсь, что функцию 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>



Линчуйте smile.gif



Спустя 44 минуты, 6 секунд (26.10.2010 - 18:47) twin написал(а):
Ну что могу сказать... Практически идеально.

Два малюююсеньких замечания.

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>';


А больше и придраться не к чиму.

Круто, поздравляю. smile.gif

Спустя 2 часа, 46 минут, 16 секунд (26.10.2010 - 21:33) ShamanV написал(а):
Цитата (twin @ 26.10.2010 - 15:47)
приведение типов лишнее. В массиве POST всегда тип string бывает. А вот обращение к несуществующему элементу вполне возможно. Туда лучше уж собачку было бы.


Забыл убрать, все равно оно мне не помогло. Несколько смутил тот факт, что '0' считается пустой строкой. Ведь по идее здесь это просто символ и само его наличие уже говорит о том, что строка не пустая....

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

Спасибо за отличную задачу и замечания. Приятно, что понял суть правильно.
Вот скажите, если следовать этому методу, то есть гарантия защиты от xss и sql-inj? Очень уж часто натыкаюсь на утверждение, что необходимо выжигать каленым железом все "плохие символы", люди целые талмуды пишут на эту тему (и не только Фленов) smile.gif

Спустя 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 написал(а):
Спс, приблуду видел smile.gif
У меня еще проблема в том, что в части кода отступы реализованы пробелами. Например, в участках, взятых из ваших листингов. Хотя, если там 4 пробела, должно все получиться. Безусловно, табуляция удобна smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.