СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Пишем систему авторизации на PHP в черновиках Из песочницы

Всем привет, сегодня Я поделюсь своим опытом вместе с вами. Недавно для моего сайта мне очень надо было сделать систему авторизации, и я её сделал. Ушло где-то 3 дня, и что бы вы не мучались, я покажу вам, как сделать такую-же.

Для начала нам надо создать файл, где будут указаны данные для подключения к базе MySQL. Назовем этот файл, допустим, «db.php», и поместим в него вот эти строки кода:

<?
session_start();
//Данные
$host = "localhost"; //Хост, где проходит подключение. Без порта.
$user = "roor"; //Пользователь MySQL
$password = ""; //Пароль MySQL
$db_name = "test"; //Название базы

$connect = mysql_connect($host, $user, $password, $db_name) or die(mysql_error()); //Соединяемся, если не успешно, выводим ошибку.
mysql_select_db($db_name, $connect) or die(mysql_error()); //Выбираем базу, если не успешно, выводим ошибку.
?>

Сохраняем файл. Теперь пишем систему регистрации. Создадим файл «register.html» со следующим содержанием:

<html>
<body>
<div>Регистрация</div>
<center>
<form action="reg_post.php" method="post"> <! -- Файл reg_post.php будет обрабатывать и заносить данные в таблицу. -->
<input type="text" name="login" placeholder="Логин"><br>
<input type="text" name="pass" placeholder="Пароль"><br>
<button type="submit">Зарегистрироваться</button><br>
</form>
</center>
</div>
</body>

Теперь про reg_post.php — этот файл будет заносить введенную нами информацию в базу данных. У файла будет следующее содержание:

 <?php
require ("../system/db.php");
if($_POST['login'] == "" OR $_POST['pass'] == ""){ 
header("Location: register.html"); //В случае, если пользователь не ввел логин или пароль, возвращаем его обратно.
}else { //Если все же ввел, то..
$login = $_POST['login']; //Определение для поля логина.
$pass = $_POST['pass']; //Определения для пароля.
$q =mysql_query("INSERT INTO `users`(`login`, `pass`) VALUES ('$login','$pass')"); //Вносим в базу введенную пользователем информацию.
header("Location: ../login.html"); //Перебрасываем пользователя на форму входа.
}
?>

Вот мы написали файл, который будет заносить информацию в базу, или проще говоря, регистрировать. Теперь же пишем файл для входа — login.html. Если присмотреться, то он очень похож по содержанию с файлом register.html

<html>
<body>
<div>Вход</div>
<center>
<form action="reg_post.php" method="post"> <! -- Файл login_post.php будет логинить пользователя в случае верности введенных им данных. -->
<input type="text" name="login" placeholder="Логин"><br>
<input type="text" name="pass" placeholder="Пароль"><br>
<button type="submit">Войти</button><br>
</form>
</center>
</div>
</body>

Далее, пишем файл login_post.php со следующим содержанием:

 <?php
require ("../system/db.php"); //Подсоединяем файл с аргументами базы
session_start(); //Запускаем сессию.
if($_POST['login'] == "" OR $_POST['pass'] == ""){ 
header("Location: index.php"); //Возвращаем пользователя на форму входа, в случае если он не ввел данные входа.
}else { //Если все-же ввел, то..
 
$pass = $_POST['pass']; //Определение для пароля.
$login = $_POST['login']; //Определение для входа.
$pro = mysql_query("SELECT * FROM users WHERE login='$login' AND pass='$pass'"); //Запрашиваем список пользователей с полученными данными.
$res = mysql_fetch_array($pro); //Сокращаем.
if(mysql_num_rows($pro) == '0'){
header("Location: login.html"); //Если пользователей не найдено, то скидываем посетителя обратно на форму входа.
}else{ //Если все-же найдены пользователи с таким же логином и паролем, то..
$_SESSION['username'] = $res['login']; //Ставим инфу сессии.
$_SESSION['pass'] = $res['pass']; //Ставим инфу сессии.
header("Location: ../"); //Перекидываем пользователя на индексную страницу сайта.
}
}
?>

В добавок еще скажу вам, как выводить данные от пользователя, и дам команду для создания таблицы.

<html>
<body>
<head>
<div>Пользователь <? echo $_SESSION['username']; ?></div> <!-- Выводим логин пользователя. -->
<div>Пароль: <? echo $_SESSION['pass']; ?></div> <!-- Выводим пароль, если надо. -->
</head>
</body>
</html>

А таблицу мы создадим с помощью ввода SQL-команды. Заходим в PMA, выбираем базу, кликаем на вкладку SQL, в поле вставляем следующую команду:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(60) NOT NULL,
  `pass` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;

Ну, вот и всё. Я надеюсь, что Вам понравилась данная статья. Если что-то упустил — то пишите в комментарии.

комментарии (10)

+5
WildZero ,   * (был изменён)
Это шутка. да?
Пароли в открытом виде?
+3
Rastishka ,  

Это шутка. да?
POST данные прямо в запросе?

+5
MisterX ,  
Это шутка. Да?
Использовать mysql_query?
+3
gbg ,  
И сборка запроса конкатенацией.
И select * вместо указания колонок.
Короче¸ все катастрофически плохо.
+4
lizarge ,  
ниже падать некуда, хабр все?
>Если что-то упустил — то пишите в комментарии.
Видимо упустил что программирование не твое.
+3
MadridianFox ,  
Вообще-то у вас получилась система аутентификации а не авторизации.
Хотя и насчёт того что она получилась, я тоже сомневаюсь)
+5
boodda ,  
Дайте полотенце! Вытереть кровавые слезы!

1. mysql_ функции как и все расширение сейчас depricated в 5.6 и вообще выпилен в 7 версии
2. SQL инъекции? — Нет, не слышал '$login' забиваем ' or 1=1/*
3. header(«Location: ../»); без exit() или die() это прямо мои любимые баги, вроде ты его с редиректил, но код то не остановил исполнение.

Ну да, так делали в… даже не знаю 2002 г.
+2
imgen ,  
код принято заливать в репозитарий, а mysql_connect, mysql_connect, mysql_query, mysql_num_rows, mysql_fetch_array — уже deprecate, соответственно их нельзя использовать.

Храним пароль пользователя в открытом виде, ай яй яй, нужен хотя бы
$pass = password_hash($_POST['pass'], PASSWORD_DEFAULT);
+1
muxa_ru ,  
SkinnerTeam

Главное не впадайте в уныние.
Есть и положительный момент — Вам сейчас весь код вычитают и предложат улучшения.
+3
web2033 ,  
Удалось найти на торренте курсы Попова 10-тилетней давности?))