| Я совсем недавно увлёкся 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), 20, 30);
?>
<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($image, 255, 255, 255);
imagestring($image, 5, 10, 10, $title, $colorBlack);
imagepng($image, $file);
imagedestroy($image);
print("<img src=\"$file\">"); }
$random = md5(uniqid(rand(), true));
$randomkey = strtoupper(substr($random, 26, 30));
$red = rand(-200, 150);
$blue = rand(-200, 150);
$green = rand(-100, 150);
$image = imagecreatefrompng($picture);
imagefilter($image, IMG_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), 20, 30);
$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($id, 1, rand(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", $key, time() + 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), 20, 30);
//получаем значение из созданной сессии
$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("Что-то не так ...");}
|
| |