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

Форум MySQL

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

 

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

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

тема: обработка форм
 
 автор: fraggedbynoob   (13.09.2006 в 02:28)   письмо автору
 
 

Я совсем недавно увлёкся PHP интересно узнать на сколько то что я сделал безопасно для WEB и вообще логично ))
Форма:

<?php
include "config.php";
//Тестируем работоспособность куков
setcookie("test""set"time() + 3000"/registration/newuser.php");
$forward getenv(HTTP_X_FORWADED_FOR);
$ip urldecode(GETENV(HTTP_CLIENTIP));
if((
$forward != NULL) and ($forward != $REMOTE_ADDR)) { $ip $ip."/".$forward; }
$secret substr(md5($ip), 2030);

?>
<html>
<head>
    <title>Регистраця</title>
</head>
<body>

<table align="center">
<form action="newuser.php" method="post">
<tr>
       <td align="right"><b>Введите Имя :</b></td>
       <td><input type="text" size="30" name="firstname"></td>
</tr>
<tr>
       <td align="right"><b>Введите Фамилию :</b></td>
       <td><input type="text" size="30" name="lastname"></td>
</tr>
<tr>
       <td align="right"><b>Введите Login :</b></td>
       <td><input type="text" size="30" name="login"></td>
</tr>
<tr>
       <td align="right"><b>Введите пароль :</b></td>
       <td><input type="password" name="password" size="30"></td>
</tr>
<tr>
       <td align="right"><b>Повторите пароль :</b></td>
       <td><input type="password" name="passwordagain" size="30"></td>
</tr>
<tr>
       <td align="right"><b>День рождения :</b></td>
       <td><select name="day"><option value="" SELECTED>День</option>
       <? for ($day 1$day <= 31; ++$day) { echo("<option value=\"$day\">$day</option>\n"); } ?>
       </select>
       <select name="month"><option value="" SELECTED>Месяц</option>
       <? for ($month 1$month <= 12; ++$month
       {
        switch (
$month
            {     case 
"1" $monthRus "Январь"; break;
                case 
"2" $monthRus "Февраль"; break;
                case 
"3" $monthRus "Март"; break;
                case 
"4" $monthRus "Апрель"; break;
                case 
"5" $monthRus "Май"; break;
                case 
"6" $monthRus "Июнь"; break;
                case 
"7" $monthRus "Июль"; break;
                case 
"8" $monthRus "Август"; break;
                case 
"9" $monthRus "Сентябрь"; break;
                case 
"10" $monthRus "Октябрь"; break;
                case 
"11" $monthRus "Ноябрь"; break;
                default : 
$monthRus "Декабрь"; break; }
       echo(
"<option value=\"$month\">$monthRus</option>\n"); } ?>
       </select>
       <select name="year"><option value="" SELECTED>Год</option>
       <? for ($year 1950$year <= 2000; ++$year) { echo("<option value=\"$year\">$year</option>\n"); } ?>
       </select></td>
</tr>
<tr>
       <td align="right"><b>Email :</b></td>
       <td><input type="text" name="email" size="30"></td>
</tr>
       <td colspan=2 align="center">
<? $picture "random.png";
function 
showPicture(&$image$file$title)
{   
$colorBlack imagecolorallocate($image255255255);
    
imagestring($image51010$title$colorBlack);
    
imagepng($image$file);
    
imagedestroy($image);
    print(
"<img src=\"$file\">"); }
$random md5(uniqid(rand(), true));
$randomkey strtoupper(substr($random2630));
$red rand(-200150);
$blue rand(-200150);
$green rand(-100150);
$image imagecreatefrompng($picture);
imagefilter($imageIMG_FILTER_COLORIZE$red$blue$green);
showPicture($image"valid_$picture"$randomkey);

$randomquery mysql_query("INSERT INTO sessions VALUES(NULL, 'randomkey', '$randomkey', '$secret', NOW())");
?></td></tr>
<tr>
 <td colspan=2 align="center"><b>Введите код изображённый на рисунке :</b>
<input type="text" size="5" name="randomword"></td>
</tr>
<tr>
       <td colspan=2 align="center"><input type="submit" name="submit" value="Поехали дальше!"></td>
       <td></td>
</tr>
</form>
</table>
</body>
</html>


Обработчик:

<?php
include "config.php";
$forward getenv(HTTP_X_FORWADED_FOR);
$ip urldecode(GETENV(HTTP_CLIENTIP));
if((
$forward != NULL) and ($forward != $REMOTE_ADDR)) { $ip $ip."/".$forward; }
$secret substr(md5($ip), 2030);
$error "";
//получаем данные отправленные формой методом POST
$firstname trim($_POST["firstname"]);
$lastname trim($_POST["lastname"]);
$login trim($_POST["login"]);
$password trim($_POST["password"]);
$passwordagain trim($_POST["passwordagain"]);
$day trim($_POST["day"]);
$month trim($_POST["month"]);
$year trim($_POST["year"]);
$mail trim($_POST["email"]);
$randomword trim($_POST["randomword"]);
$test $_COOKIE["test"];
//проверяем включены ли куки если включены удаляем тестовые куки 
if(empty($test)) { $error $error."<li>У Вас отключены - <b>cookie</b>";} else { setcookie("test"); }
if(
$secret) { $randomquery mysql_query("SELECT * FROM sessions WHERE login LIKE '$secret' AND value LIKE '$randomword'");
                if(
mysql_num_rows($randomquery)<1) { $error $error."<li>Вы не правильно ввели <b>код</b> изображённый не рисунке."
                       
mysql_query("DELETE FROM sessions WHERE login = '$secret'"); } 
                else { 
mysql_query("DELETE FROM sessions WHERE login = '$secret'");
                
mysql_query("DELETE FROM sessions WHERE puttime < now() - interval '5' minute"); } }
                
                
// проверяем вводимые пользователем данные на наличие и пытаемся удалить все тэги и слэши (если данные получены)
if(empty($firstname)) { $error $error."<li>Вы не ввели <b>имя</b>.";} else { $firstname =  stripcslashes(strip_tags($firstname));}
if(empty(
$lastname)) { $error $error."<li>Вы не ввели <b>фамилию</b>.";} else { $lastname =  stripcslashes(strip_tags($lastname));}
if(empty(
$login)) { $error $error."<li>Вы не ввели <b>логин</b>.";} else { $login =  stripcslashes(strip_tags($login));}
if(empty(
$password)) { $error $error."<li>Вы не ввели <b>пароль</b>.";} else { $password =  stripcslashes(strip_tags($password));}
if(empty(
$passwordagain)) { $error $error."<li>Вы не повторили <b>пароль</b>.";} else { $passwordagain =  stripcslashes(strip_tags($passwordagain));}
if(
$password !== $passwordagain) { $error $error."<li>Введённые пароли <b>не совпадают</b>.";}
// отдельно проверяем дату на наличие, соответствие типу данных и значение 
// создаём массивы всех возможных значений для дня, месяца и года, с помощью in_array проверяем на присутствие в массиве полученой переменной
$checkDay 0;
$checkMonth 0;
$checkYear 1949;
while(++
$checkDay <= 31) { $Checkday [] = "$checkDay"; }
while(++
$checkMonth <= 12) { $Checkmonth [] = "$checkMonth"; }
while(++
$checkYear <= 2000) { $Checkyear [] = "$checkYear"; }
if(empty(
$day)) { $error $error."<li>Вы не указали <b>день</b> рождения.";} elseif(gettype($day) !== integer and in_array($day$Checkday) !== true) { $error $error."<li>Не совсем похоже на <b>день</b>.";}
if(empty(
$month)) { $error $error."<li>Вы не указали <b>месяц</b> рождения.";} elseif(gettype($month) !== integer and in_array($month$Checkmonth) !== true) { $error $error."<li>Не совсем похоже на <b>месяц</b>.";}
if(empty(
$year)) { $error $error."<li>Вы не указали <b>год</b> рождения.";} elseif(gettype($year) !== integer and in_array($year$Checkyear) !== true) { $error $error."<li>Не совсем похоже на <b>год</b>.";}
if(empty(
$mail)) { $error $error."<li>Вы не ввели <b>email</b>.";} else { $mail =  stripcslashes(strip_tags($mail));}
//Если пользователь не заполнил поля - сообщаем ему об этом
if(!empty($error)) { print ("<b>Внимание ошибка:</b> $error <br>"); exit;}
//Теперь проверяем полученые значения на соответствие условию
$attention ="";
//Блок проверки полученных данных с помощью регулярных выражений
if(!ereg("(^[a-zA-Zа-яА-Я]{2,30})$"$firstname)) { $attention $attention."<li><b>имя</b> - может содержать <b>только буквенные символы</b>. Разрешается вводить <b>от  2 до 30 символов</b>.";}
if(!
ereg("(^[a-zA-Zа-яА-Я]{2,30})$"$lastname)) { $attention $attention."<li><b>фамилия</b> - может содержать <b>только буквенные символы</b>. Разрешается вводить <b>от  2 до 30 символов</b>.";}
if(!
ereg("(^([a-zA-Zа-яА-Я0-9# ? / & - _]){3,12})$"$login)) { $attention $attention."<li><b>логин</b> - может содержать <b>буквенно-цифровые символы</b>, дополнительно можно использовать (# ? / & - _). Разрешается вводить <b>от  3 до 12 символов</b>.";}
$id md5(uniqid(rand(), true));
$validpassword substr($id1rand(4,16));
if(!
ereg("(^([a-zA-Zа-яА-Я0-9]){4,16})$"$password)) { $attention $attention."<li><b>пароль</b> - может содержать <b>буквенно-цифровые символы</b>. Разрешается вводить <b>от  4 до 16 символов</b>. Например : <b>$validpassword</b>";}
//Блок проверки даты на  допустимость если дата существует форматируем её
if(checkdate($month$day$year) !== true) { $attention $attention."<li>Такой <b>даты</b> не существует или вы родились в <b>несуществующий день</b>.";} 
else { 
switch (
$month
            {     case 
"1" $monthRus "января"; break;
                case 
"2" $monthRus "февраля"; break;
                case 
"3" $monthRus "марта"; break;
                case 
"4" $monthRus "апреля"; break;
                case 
"5" $monthRus "мая"; break;
                case 
"6" $monthRus "июня"; break;
                case 
"7" $monthRus "июля"; break;
                case 
"8" $monthRus "августа"; break;
                case 
"9" $monthRus "сентября"; break;
                case 
"10" $monthRus "октября"; break;
                case 
"11" $monthRus "ноября"; break;
                default : 
$monthRus "декабря"; break; }
$BirthDate "$day-$monthRus-$year г."; }
//Блок проверки email адреса
$validemail "something@anyserver.com";
if(!
preg_match("/^[^@\s]+@([a-z0-9]+\.)+([a-z]{2}|com|net|edu|org|gov|mil|int|biz|pro|info|arpa|aero|coop|name|museum)$/ix"$mail))
$attention $attention."<li>Введите <b>email</b> в виде - <b>$validemail</b>.";}
elseif(
$mail == $validemail) { $attention $attention."<li>Неужели так трудно ввести свой настоящий <b>email</b>?";}
//Блок проверки логина
$eng = array("A""a""B""E""e""K""k""M""H""O""o""P""p""C""c""T""X""x");
$rus = array("А""а""В""Е""е""К""к""М""Н""О""о""Р""р""С""с""Т""Х""х");
$englogin str_replace($rus$eng$login);
$ruslogin str_replace($eng$rus$login);
$query mysql_query("SELECT * FROM members WHERE login LIKE '$login' OR login LIKE '$englogin' OR login LIKE '$ruslogin'");
if(
mysql_num_rows($query)>0) { $attention $attention."<li>Введённый Вами <b>логин</b> уже используется другим пользователем";}
//Если пользователь заполнил поля не правильно  - сообщаем ему об этом
if(!empty($attention)) { print ("<b>Не все введённые Вами данные соответствуют необходимым условиям:</b> $attention <br>"); exit;}
//Если пользователь заполнил все поля и заполнил их правильно  - выводим данные
else { 

//Содаём уникалный ключ из значений полученых от пользователя
$secret "$firstname$lastname$login$password$BirthDate$mail";
$key md5($secret);
//Сохраняем уникальный ключ в куках клиента
setcookie("key"$keytime() + 300"/registration/registration.php");
//Так же сохраняем этот же ключ в созданной нами сессии 
$sessionquery mysql_query("INSERT INTO sessions VALUES(NULL, 'key', '$key', '$login', NOW())");
 
?>
<center>
<strong><font face="courier new, courier, mono" size="5">Регистрационная карточка  заполненна.<br>Посторайтесь не потерять пароль.</font></strong>
<br><br>
<table>
<tr>
       <td align="right"><b>Имя :</b></td>
       <td><?print $firstname;?></td>
</tr>
<tr>
       <td align="right"><b>Фамилия :</b></td>
       <td><?print $lastname;?></td>
</tr>
<tr>
       <td align="right"><b>Login :</b></td>
       <td><?print $login;?></td>
</tr>
<tr>
       <td align="right"><b>пароль :</b></td>
       <td><?print $password;?></td>
</tr>
<tr>
       <td align="right"><b>День рождения :</b></td>
       <td><?print $BirthDate;?></td>
</tr>
<tr>
       <td align="right"><b>Email :</b></td>
       <td><?print $mail;?></td>
</tr>
</table>


<form action="registration.php" method="post">
<input type="hidden" name="firstname" value="<?print $firstname;?>">
<input type="hidden" name="lastname" value="<?print $lastname;?>">
<input type="hidden" name="login" value="<?print $login;?>">
<input type="hidden" name="password" value="<?print $password;?>">
<input type="hidden" name="birthdate" value="<?print $BirthDate;?>">
<input type="hidden" name="mail" value="<?print $mail;?>">
<input type="submit" name="submit" value="Зарегистрироваться"></form>
<?
}
?>


регистрация:

<?php
include "config.php";
//Получаем уникальный ключ из кук 
$cookkey $_COOKIE["key"];
//получаем данные отправленные формой методом POST
$firstname trim($_POST["firstname"]);
$lastname trim($_POST["lastname"]);
$login trim($_POST["login"]);
$password trim($_POST["password"]);
$BirthDate trim($_POST["birthdate"]);
$mail trim($_POST["mail"]);
$forward getenv(HTTP_X_FORWADED_FOR);
$ip urldecode(GETENV(HTTP_CLIENTIP));
if((
$forward != NULL) and ($forward != $REMOTE_ADDR)) { $ip $ip."/".$forward; }
$secret substr(md5($ip), 2030);
//получаем значение из созданной сессии
$sessionquery mysql_query("SELECT value FROM sessions WHERE login LIKE '$login'AND valuename LIKE 'key'");
$sessionquery mysql_fetch_array($sessionquery);
$key $sessionquery["value"];
//Генерируем уникальный ключ из полученных данных
$group "$firstname$lastname$login$password$BirthDate$mail";
$md5key md5($group);
//Полученный ключ из кук, сессии и сгенерированный ключ - должны совпадать, если это так заносим данные в базу
if($cookkey == $md5key AND $key == $md5key) { 
         
$query mysql_query("INSERT INTO members VALUES(NULL, '$firstname', '$lastname', '$login', '$password', '$BirthDate', '$mail', NOW())");
         
//Удаляем значение переменной из сессии после занесения данных в базу 
         
$query mysql_query("DELETE FROM sessions WHERE login = '$login'");
         
$query mysql_query("DELETE FROM sessions WHERE login = '$secret'");
//Удаляем куки
 
        
        
         
print("Всё хорошо!"); } else { print("Что-то не так ...");}

   
 
 автор: CrazyAngel   (13.09.2006 в 02:33)   письмо автору
 
   для: fraggedbynoob   (13.09.2006 в 02:28)
 

сорри....очень много букав

   
 
 автор: cheops   (13.09.2006 в 12:43)   письмо автору
 
   для: fraggedbynoob   (13.09.2006 в 02:28)
 

Регистрация будет рано или поздно взломана, лучше обезопасить переменные при помощи конструкций
<?php
  
if (!get_magic_quotes_gpc())
  {
    
$firstname trim(mysql_escape_string($firstname));
    
$login trim(mysql_escape_string($login));
    
// ...
  
}
?>

PS Такие здоровые листинги лучше прикреплять к сообщениям в виде файлов.

   
 
 автор: fraggedbynoob   (13.09.2006 в 15:20)   письмо автору
 
   для: cheops   (13.09.2006 в 12:43)
 

Меня просто интересует какая конструкция наиболее безопасна. Я специально не использовал куки и сессии (это в последней версии). Я не достаточно набил руку... Думаю можно сделать более рационально и не так громоздко ))). И вообще имеет ли смысл это делать)).

   
Rambler's Top100
вверх

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