PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
Шрифт:
Интервал:
Закладка:
19. Регистрация пользователей
https://ruseller.com/lessons.php?rub_id=37&id=350
Для регистрации пользователей используются файлы:
• Страница с формой регистрации «form_registration.html».
• Страница сохранения пользователя «save_user.php».
• Страница активации пользователя «activation.php».
• Капча
Листинг 35. form_registration.html Путь: news/chat/admin/users/ form_registration.html
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
<title>Регистрация на сайте</title>
</head>
<body class="chatbody">
<h2>Регистрация на сайте</h2>
<form
class="chatform"
action="save_user.php"
method="post"
enctype="multipart/form-data"
id="reg"
>
<fieldset class="chatfieldset">
<legend>Данные для авторизации</legend>
<label
>Ваш логин *: <input name="login" type="text" size="15" maxlength="15"
/></label>
<hr />
<label
>Ваш пароль *:
<input name="password" type="password" size="15" maxlength="15"
/></label>
<hr />
<label
>Ваш E-mail *:
<input name="email" type="email" size="15" maxlength="100"
/></label>
<br />
</fieldset>
<br />
<fieldset class="chatfieldset">
<legend>Выберите аватар</legend>
<label>
Изображение должно быть квадратной формы<br />
и иметь расширение jpg, gif или png:<br />
<br />
<input type="FILE" name="fupload"
/></label>
</fieldset>
<br />
<!– В переменную fupload отправится изображение, которое выбрал пользователь. –>
<fieldset class="chatfieldset">
<legend>Введите код с картинки *:</legend>
<input type="text" name="capcha" />
<div><img src="/chat/capcha/captcha.php" /></div>
</fieldset>
<p>
<input type="submit" name="submit" value="Зарегистрироваться" />
<!– Кнопочка (type="submit") отправляет данные на страничку save_user.php –>
</p>
</form>
Звездочками (*) обозначены поля, обязательные для заполнения.
<p><a href="/../">Вернуться</a></p>
</body>
</html>
Выводит страницу «Регистрация на сайте» и форму регистрации. В форме предусмотрена защита при помощи «капчи» и предлагается отправка для регистрации следующих данных: «Логин», «email», «Пароль», «Аватар».
20. Капча
Файлы капчи: обработчик и папка с шрифтами, выводят на форме регистрации проверочный код, который пользователь должен будет ввести.
Листинг 36. captcha.php Путь:chatcapchacaptcha.php
<?php
if (session_id() == '') {
session_start();
}
$string = "";
for ($i = 0; $i < 5; $i++) {
$string .= chr(rand(97, 122));
}
$_SESSION['rand_code'] = $string;
$dir = $_SERVER['DOCUMENT_ROOT'] . '/chat/capcha/fonts/verdana.ttf';
$image = @imagecreatetruecolor(170, 60) or die('Невозможно инициализировать GD поток'); // Создаём изображение
$black = imagecolorallocate($image, 0, 0, 0);
$color = imagecolorallocate($image, 200, 100, 90);
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image, 0, 0, 399, 99, $white);
imagettftext($image, 30, 0, 10, 40, $color, $dir, $_SESSION['rand_code']);
header("Content-type: image/png");
imagepng($image);
Здесь в цикле генерируется строка из случайных чисел, при этом числа сразу преобразуются в символьные эквиваленты. Диапазон чисел 97-122 соответствует буквам латинского алфавита в диапазоне a-z по ASCII http://www.asciitable.com/ . Полученный набор букв в виде строки сохраняется в переменную сессии, а затем оформляется в виде изображения.
21. Страница сохранения пользователя
За сохранение и обработку полученных при регистрации данных пользователя отвечает файл «save_user.php»
Листинг 37. save_user.php Путь: news/chat/admin/users/ save_user.php
<?php
error_reporting(E_ALL);
if (session_id() == '') {
session_start();
}
/* заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную */
if (isset($_POST['login'])) {
$login = $_POST['login'];
if (mb_strlen($login) < 2 or mb_strlen($login) > 15) { //проверяем длину логина
exit("Логин должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
}
if ($login == '') {
unset($login);
}
}
/* заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную */
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (mb_strlen($password) < 3 or mb_strlen($password) > 15) { //проверяем длину пароля
exit("Пароль должен состоять не менее чем из 3 символов и не более чем из 15."); //останавливаем выполнение сценариев
}
if ($password == '') {
unset($password);
}
}
/* заносим введенный пользователем код в переменную $capcha, если он пустой, то уничтожаем переменную */
if (isset($_POST['capcha'])) {
$capcha = $_POST['capcha'];
if ($capcha == '') {
unset($capcha);
}
}
/* заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную */
if (isset($_POST['email'])) {
$email = $_POST['email'];
if ($email == '') {
unset($email);
}
}
$capcha = stripslashes($capcha); //sequrity чистим капчу
$capcha = htmlspecialchars($capcha);
$capcha = trim($capcha); //удаляем лишние пробелы
if (($capcha == $_SESSION["rand_code"]) && ($capcha != "")) { //проверяем капчу
} else {
exit("Капча введена неправильно");
}
if (empty($login) or empty($password) or empty($email) or empty($capcha)) { //если пользователь не ввел данные, то выдаем ошибку и останавливаем скрипт
exit("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
}
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^.]+.[a-z]{2,3}/i", $email)) { //проверка е-mail адреса регулярными выражениями на корректность
exit("Неверно введен е-mail!");
}
$login = stripslashes($login); //если логин и пароль введены, то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login); //удаляем лишние пробелы
$password = trim($password);
/*......................Шифруем пароль...........................*/
//можно добавить несколько своих символов по вкусу, например, вписав "she".
//Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет.
//Но советую ставить другие символы, можно в начале строки или в середине.
//При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.
$password = md5($_POST['password'] . 'swl'); //шифруем пароль
include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php'; // подключаемся к базе
$sth = $dsn->prepare("SELECT id FROM users WHERE login=:login"); // проверка на существование пользователя с таким же логином
$sth->execute(array(':login' => $login));
if (!empty($sth->fetch(PDO::FETCH_ASSOC))) {
exit("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");
}
/*....................avatar................................*/
if (empty($_FILES['fupload']['name'])) {
//если переменной не существует (пользователь не отправил изображение),то присваиваем ему заранее приготовленную картинку с надписью "нет аватара"
$avatar = "avatars/noavatar.png"; //можете нарисовать net-avatara.jpg или взять в исходниках
} else {
//иначе – загружаем изображение пользователя
$path_to_90_directory = 'avatars/'; //папка, куда будет загружаться начальная картинка и ее сжатая копия
/* проверка формата исходного изображения */
if (preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/', $_FILES['fupload']['name'])) {
$filename = $_FILES['fupload']['name'];
$source = $_FILES['fupload']['tmp_name'];
$target = $path_to_90_directory . $filename;
move_uploaded_file($source, $target); //загрузка оригинала в папку $path_to_90_directory
if (preg_match('/[.](GIF)|(gif)$/', $filename)) {
$im = imagecreatefromgif($path_to_90_directory . $filename); //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
if (preg_match('/[.](PNG)|(png)$/', $filename)) {
$im = imagecreatefrompng($path_to_90_directory . $filename); //если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
if (preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
$im = imagecreatefromjpeg($path_to_90_directory . $filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
// Создание квадрата 90x90
// dest – результирующее изображение
//