K
Kauperwood
исходя из существующего
БД
файл для регистрационной формы (проверяет ошибки в форме и отправляет письмо с кодом активации):
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">registration.php</div></div><div class="sp-body"><div class="sp-content">
файл активации пользователя:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">activation.php</div></div><div class="sp-body"><div class="sp-content">
файл авторизации:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">login.php</div></div><div class="sp-body"><div class="sp-content">
и еще чуть не забыл файл для выхода
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">logout.php</div></div><div class="sp-body"><div class="sp-content">
и две формы ввода данных
первая для регистрации:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">registration_form.php</div></div><div class="sp-body"><div class="sp-content">
и вторая для логина та что должна быть вставлена в корневой файл:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">index.php</div></div><div class="sp-body"><div class="sp-content">
без реализации кук!
что мог проверил, должно работать!
может кому то пригодиться, прикрепил архивом все файлы + моя мини-капча.
Чего пишу то, хотел бы поинтересоваться каким образом это все сломать, или что можно предпринять что бы стало безопаснее, и тому подобное.
Ссылка скрыта от гостей
чтобы не теряться в кавычках допилил файлы изменив способ вывода ошибок.БД
Код:
CREATE TABLE users (
id mediumint(9) NOT NULL AUTO_INCREMENT,
login varchar(32) NOT NULL DEFAULT 'CREATE UNIQUE INDEX',
pass varchar(32) NOT NULL DEFAULT 'NOT NULL',
email varchar(64) NOT NULL DEFAULT 'CREATE UNIQUE INDEX ',
`status` tinyint(2) DEFAULT NULL,
`timestamp` int(10) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM;
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">registration.php</div></div><div class="sp-body"><div class="sp-content">
Код:
<?php
session_start();
$host = "host"; // хост
$user = "whoisthis"; // пользователь
$pass = "1234"; // пароль
$db = "ok_db"; // наша БД
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$rLogin = trim($_POST['rLogin']);
$rPass = trim($_POST['rPass']);
$rPass2 = trim($_POST['rPass2']);
$rEmail = trim($_POST['rEmail']);
$captha1 = $_POST['captcha'];
$mdPassword = md5($rPass);
$time = time();
// Устанавливаем соединение с бд(не забудьте подставить ваши значения сервер-логин-пароль)
$link = mysql_connect($host, $user, $pass);
$errore='';
if ($rLogin == '') $errore .= "Поле 'Логин' не заполнено<br />\n";
// Логин может состоять из букв, цифр и подчеркивания
if (!preg_match("/^\w{3,}$/", $rLogin)) $errore .="В поле 'Логин' введены недопустимые символы<br />\n";
if ($rEmail == '') $errore .= "Поле 'E-mail' не заполнено<br />\n";
// Проверяем e-mail на корректность
if (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $rEmail)) $errore .= "Указанный 'E-mail' имеет недопустимый формат<br />\n";
if ($rPass == '' || $rPass2 == '') $errore .= "Поле 'Пароль' не заполнено<br />\n";
if ($rPass !== $rPass2) $errore .= "Поля 'Пароль' и 'Повтор пароля' не совпадают<br />\n";
// Пароль не может состоять из букв, цифр и подчеркивания
if (!preg_match("/^\w{3,}$/", $rPass)) $errore .= "В поле 'Пароль' введены недопустимые символы<br />\n";
if (!$captha1) $errore.="не введен защитный код!<br>";
if ($captha1 != $_SESSION['cap_code']) $errore.="не корректный защитный код!<br>";
// В базе данных у нас будет храниться md5-хеш пароля
if (!$link) $errore .= "Не могу соединиться с базой данных";
header('Content-Type: text/html; charset= utf-8');
echo "<b style='color:red;'>$errore</b><br>";
if (!$errore) {
$mysqlerr ="";
mysql_select_db('okrasim_db', $link);
$cheklogin = mysql_query("SELECT * FROM users WHERE login = '".$rLogin."'",$link);
$chekmail = mysql_query("SELECT * FROM users WHERE email = '".$rEmail."'",$link);
if (mysql_num_rows($cheklogin)>0) $mysqlerr .= "Такое имя уже используеться<br />\n";
if (mysql_num_rows($chekmail)>0) $mysqlerr .= "Такой емануил занят<br />\n";
header('Content-Type: text/html; charset= utf-8');
echo "<b style='color:blue;'>$mysqlerr</b><br>";
if (!$mysqlerr) {
mysql_query("INSERT INTO users (login, pass, email, timestamp)
VALUES ('$rLogin','$mdPassword','$rEmail',$time)",$link);
header('Content-Type: text/html; charset= utf-8');
echo "Пользователь добавлен<br />\n";
// Получаем Id, под которым юзер добавился в базу
$id = mysql_result(mysql_query("SELECT LAST_INSERT_ID()", $link), 0);
// Составляем "keystring" для активации
$key = md5(substr($rEmail, 0 ,2).$id.substr($rLogin, 0 ,2));
$date = date("d.m.Y",$time);
// Компонуем письмо
$subject = 'Подтверждение регистрации на сайте ';
$letter = <<< LTR
Здравствуйте!
Ваши регистрационные данные:
логин: $rLogin
пароль: $rPass
Для активации аккаунта вам следует пройти по ссылке:
http://sayta.net/activation.php?login=$rLogin&key=$key //запрос обработает файл активации
Данная ссылка будет доступна в течении 5 дней.
$date
LTR;
// Отправляем письмо
if (!mail($rEmail, $subject, $letter, "Content-Type: text/plain; charset=utf-8\r\n\r\n".$headers)) {
// Если письмо не отправилось, удаляем юзера из базы
mysql_query("DELETE FROM users WHERE login='".$login."' LIMIT 1", $link);
header('Content-Type: text/html; charset= utf-8');
echo 'Произошла ошибка при отправке письма. Попробуйте зарегистрироваться еще раз.';
}
else {
header('Content-Type: text/html; charset= utf-8');
echo 'Вы успешно зарегистрировались в системе. На указанный вами
e-mail было отправлено письмо со ссылкой для активации аккаунта.
У вас 5 дней!';
header('Refresh: 3; URL=index.php');
}
mysql_close($link);
} //$mysqlerr
}//$errore
}//$_SERVER['REQUEST_METHOD'] == 'POST'
?>
файл активации пользователя:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">activation.php</div></div><div class="sp-body"><div class="sp-content">
Код:
<?php
if (isset($_GET['login']) && isset($_GET['key'])) {
$login = $_GET['login'];
$key = $_GET['key'];
$activationerror = "";
// Делаем проверку login на нехорошие символы
if (!preg_match("/^\w{3,}$/", $login)) $activationerror .="Неправильная ссылка!<br>";
$time = time();
$link = mysql_connect('host','user','password');
if (!$link) {
$activationerror .= "Не удалось соединиться с БД!<br>"; mysql_close($link);
}
mysql_select_db('okrasim_db', $link);
$res = mysql_query("SELECT id, email, status, timestamp
FROM users WHERE login='$login' LIMIT 1", $link);
// Есть ли пользователь с таким логином?
if (mysql_num_rows($res) != 1) {
$activationerror .="Такого пользователя нет!<br>"; mysql_close($link);
}
$user = mysql_fetch_row($res);
// Может он уже активен?
if ($user[2] == 1) {
$activationerror .="Данный логин уже подтвержден!<br>"; mysql_close($link);
}
// Успел ли юзер активировать логин? (если нет - удаляем из базы)
if ($user[3] - $time > 5*24*60*60) {
mysql_query("DELETE FROM users WHERE login='$login' LIMIT 1", $link);
$activationerror .="Срок активации истёк! Регистрируйтесь заново!<br>";mysql_close($link);
}
$key1 = md5(substr($user[1], 0 ,2).$user[0].substr($login, 0 ,2));
// Проверяем "keystring"
if ($key1 != $key) {
$activationerror .="Неправильная контрольная сумма!"; mysql_close($link);
}
echo "<b style='color:green;'>".$activationerror."</b><br>";
if (!$err) {
// Если все проверки пройдены - активируем логин!
mysql_query("UPDATE users SET status = 1 WHERE login='$login'", $link);
echo "Ок вы зарегистрированы!";
mysql_close($link);
}
}
?>
файл авторизации:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">login.php</div></div><div class="sp-body"><div class="sp-content">
Код:
<?php
if (isset($_POST['login'])) {
$passwordHash = md5($_POST['password']);
$login = $_POST['login'];
$loginerr="";
// Проверка логина на плохие смиволы
if (!preg_match("/^\w{3,}$/", $login)) $loginerr .="Неправильный логин!";
$link = mysql_connect('host','user','password');
if (!$link) $loginerr .="Не удалось соединиться с БД";
mysql_select_db('db', $link);
$res = mysql_query("SELECT status FROM users WHERE login='$login'AND pass='$passwordHash'", $link);
// Есть ли пользователь с таким логином?
if (mysql_num_rows($res) < 1) {
$loginerr.="Такого пользователя нет, или пароль не верный!";mysql_close($link);
}
// Какой статус у пользователя?
if (mysql_result($res, 0) != 1) {
$loginerr.="Логин не активирован!";
mysql_close($link);
}
header('Content-Type: text/html; charset= utf-8');
echo "<b style='color:grey;'>$loginerr</b><br>";
if(!$loginerr) {
// Стартуем сессию и записываем логин в суперглобальный массив $_SESSION
session_start();
$_SESSION['user'] = $login;
mysql_close($link);
// Если определена страница с которой мы пришли,
// на нее и переадресуем, либо на главную
if (isset($_SERVER['HTTP_REFERER'])) {
header ("location: ".$_SERVER['HTTP_REFERER']);
}
else {
header ("location: index.php");
}
}
}
?>
и еще чуть не забыл файл для выхода
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">logout.php</div></div><div class="sp-body"><div class="sp-content">
Код:
<?
session_start();
if (isset($_SESSION['user'])) {
// удаляем элемент "user"
unset($_SESSION['user']);
}
if (isset($_SERVER['HTTP_REFERER'])) {
header ("location: ".$_SERVER['HTTP_REFERER']);
}else {
header ("location: index.php");
}
?>
и две формы ввода данных
первая для регистрации:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">registration_form.php</div></div><div class="sp-body"><div class="sp-content">
Код:
<form action="registration.php" method="post">
<table>
<tr>
<td>Логин* :</td>
<td><input type="text" name="rLogin" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
<td>Пароль* :</td>
<td><input type="password" name="rPass" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
<td>Повторите пароль* :</td>
<td><input type="password" name="rPass2" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
<td>E-mail* :</td>
<td><input type="text" name="rEmail" value="" size="25" maxlength="30" /></td>
</tr>
<tr>
<td>Captcha* :</td>
<td><img id="cap" src="capa.php"/><input class="capcode" type="text" name="captcha" /></td>
</tr>
<tr>
<td></td>
<td><input type="reset" name="reset" value="Очистить" />
<input type="submit" name="ok" value="Готово" /></td>
</tr>
</table>
</form>
и вторая для логина та что должна быть вставлена в корневой файл:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">index.php</div></div><div class="sp-body"><div class="sp-content">
Код:
<?
session_start();
if (isset($_SESSION['user'])) {
$auth = "Привет ".$_SESSION['user']."!<br />\n";
$auth .= "<a href='logout.php'>Выйти</a>";
$docum = "Эта информация только для зарегистрированных";
}else {
$auth = <<< AUTH
<form method="post" action="login.php">
<table>
<tr>
<td>Логин</td>
<td><input type="text" name="login"></td>
</tr>
<tr>
<td>Пароль</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Войти"></td>
</tr>
</table>
</form>
AUTH;
$docum = "Эта общая информация";
}
?>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>авторизация</title>
</head>
<body>
<? echo $auth; ?>
<hr />
<? echo $docum; ?>
<br>
<a href="reg_form.php">регистрация</a>
</body>
</html>
без реализации кук!
что мог проверил, должно работать!
может кому то пригодиться, прикрепил архивом все файлы + моя мини-капча.
Чего пишу то, хотел бы поинтересоваться каким образом это все сломать, или что можно предпринять что бы стало безопаснее, и тому подобное.