Меню Закрыть

Php авторизация через сессии

Содержание

Ко мне обратился человек, который делал регистрацию и авторизацию для гостевой книги. Он новичок и эта задача вызвала у него большое количество вопросов и проблем. В этом посте я расскажу о том как можно это все делать и как делать не нужно. Все это конечно с примерами.

Итак, есть задача — сделать регистрацию в системе и возможность авторизации. Как это делать? Начнем по порядку.

Регистрация на php

Тут все просто. Делается хранилище данных для пользователей. Обычно это таблица БД. В нее входят такие поля как id, username и password. Остальные поля опциональны. Вы можете собирать e-mail пользователей, их адреса, возможные ip, время выхода в сеть, кодовые слова от банковских карт, секретные вопросы.

В общем, главное — это пара логин-пароль.

Первый важный момент — нельзя хранить пароли пользователей в открытом виде. То есть, как текст. Нельзя потому что если к БД получит доступ кто-то посторонний — он получит базу логин-паролей пользователей, что вряд ли им понравится. А если учесть что логин-пароль у многих пользователей на разных сервисах одни и те же — это ставит под угрозу и личные данные и финансы и личную переписку и все что угодно.

Пароли надо хранить в виде хэша. Хэширование — это операция, которая превращает исходные данные в какой-то слепок известной длины. Это хорошо тем, что слепок уникален. То есть, если мы изменим в исходных данных хотя бы один символ — слепок на выходе операции хэширования получится совершенно, до неузнаваемости другим. Операция хэширования необратима, то есть, из этого слепка не получится развернуть исходные данные. Этим оно и отличается от шифрования.

В MySQL и php есть одна и та же распространенная и безопасная функция хэширования — md5. Этот алгоритм принимает данные и отдает отпечаток.

Итак, мы получаем данные от пользователя, проверяем не пустые ли они, не содержат ли всяких ненужных нам символов (не ограничивайте пользователей слишком сильно). И теперь делаем запрос вроде этого:

Обратите внимание — я специально обозвал переменные $quoted_ потому что перед запихиванием их в запрос их обязательно надо отэскейпить функцией mysql_real_escape_string(). Так как эта функция очень часто используется, а пишется очень длинно (люблю архитекторов пхп) — я рекомендую запихать ее в свою оболочку. Например, так:

Авторизация на php

Мы добавили нового пользователя и теперь он авторизуется. Мы рисуем ему форму логина-пароля и ловим его данные. Что дальше? Ведь пароль нам пришел в открытом виде, а в базе — хэш пароля. Придется конвертировать пароль в хэш, потом сравнивать их? Не, можно сделать проще — в один запрос.

Если запрос вернет строку — это будет строка с данными пользователя. Если нет — такого пользователя в таблице нет. Данные пользователя очень нам пригодятся — стоит их получить в ассоциативный массив.

Запомнить пользователя

Теперь нам надо запомнить что пользователь авторизован и точно знать кто это. Первое что приходит в голову — использовать для этого куки. Действительно — запихать в куки логин и id пользователя и всегда знать кто запрашивает страницу в данный момент.

Но это порочная практика. Почему? Потому что куки — это файл, который хранится у пользователя в браузере и данные из этого файла передаются серверу в каждом запросе. Во-первых, они передаются как текст, а это значит — их легко перехватить. Во-вторых, это простой текст, посылаемый пользователем. Поэтому его можно буквально переписать. Например, если мы решили хранить в куках логин пользователя "Вася" он может открыть управление куками в своем браузере, найти нужную куку и исправить ее на, скажем, "Admin". И все. Теперь при каждом запросе мы будем получать куку, которая нам будет сообщять юзернейм пользователя — "Admin".

Читайте также:  Int main что означает

Поэтому безопаснее хранить все данные на сервере в недоступном из веба месте. В какой-то папке, к которой нельзя получить доступ из браузера. В эту папку нужно писать все данные о пользователе и читать их оттуда каждый раз, когда он запрашивает документ. Чтобы узнать какому пользователю принадлежит какой файл данных — надо обзывать файл уникальным именем и вот это имя кидать уже пользователю в куки. Таким образом, пользователь не сможет узнать как называется файл для пользователя Admin — этот файл генерирует система на сервере. И это позволяет таскать от документа к документу хоть пароли в открытом виде.

То что я описал — это механизм сессии. В Perl, например, для использования сессий нужно загружать модули. А в php сессии поддерживаются из коробки. Фактически, все что вам нужно знать — это функция session_start() и массив $_SESSION. Это все. Сейчас расскажу.

В каждом скрипте, где вы будете писать в сессию или читать из нее, вам надо до того, как вы выведете какую-то информацию вызвать функцию session_start(). Это запустит сессию. Эта функция создаст файл сессии если его нет или прочитает его если скрипту была передана специальная кука.

Чтобы записать в сессию данные нужно просто записать их в массив $_SESSION. Сейчас нам надо помнить id юзера.

Все. Теперь каждый раз когда пользователь будет запрашивать скрипт, который использует сессии — вам будет доступно значение элемента $_SESSION[‘userid’].

Поэтому когда пользователь ввел логин и пароль, мы получили его данные из БД, что подтверждает что такой пользователь есть в нашей базе данных, мы запоминаем его в сессии.

Узнать авторизован ли пользователь

Ну это уж проще простого! Теперь, когда вы знаете как работают сессии — узнать авторизован ли пользователь — дело одной строки. Вот она:

Если в сессии определен id пользователя, значит он уже прошел авторизацию. Но как узнать какой именно это пользователь? Какой его логин? Дата рождения? Кодовое слово для банковской карты? Девичья фамилия матери?

Ну очевидно — сделать один запрос к таблице users. У нас же есть id этого пользователя.

Как разлогинить пользователя, сделать выход

Ну это уж совсем просто. Если мы определяем авторизован ли пользователь по наличию userid в сессии, то чтобы его разлогинить нужно удалить его оттуда. Делается так:

Еще можно убить сессию для верности. Это очистит куку у пользователя и уничтожит файл сессии на сервере. При этом из нее пропадут все данные. Делается так:

На этом все. Если остались какие-то вопросы — не стесняйтесь обращаться. Более того, вы можете обратиться ко мне по icq или почте и попросить помочь с чем-нибудь. Я обычно не отказываю. Если помощь потребуется серьезная — я могу попросить небольшую оплату. Кроме того, я могу дистанционно учить вас делать сайты! Вот такой я коуч и гуру:) А если вы хотите получать уроки и трюки просто так, бесплатно — подпишитесь на RSS моего блога.

При разработке интернет магазинов практически всегда требуется авторизация. Например, для входа в личный кабинет пользователя, или систему управления интернет-магазином.

Форма авторизации обычно состоит из двух текстовых полей (Логин и пароль) и кнопки Войти. Сейчас при создании в интернет-магазинах личного кабинета, набирает моду установка полей Телефон и Имя, или Имя и email, и другие комбинации. Но советуем так ни когда не делать, т.к. Имя можно написать по-разному, телефон тоже (84952322323 или 232-23-23).

PHP сессии

В этом уроке вы познакомитесь с правильной работой с сессиями на PHP.

Читайте также:  Сигнал шум фсин это

Сессии нужны для сохранения определенной информации на стороне браузера. Практически тоже самое что и переменные, отличается только тем, что переменные при переходе на другую страницу сайта, или при обновлении текущей страницы теряют свои значения, а данные записанные в сессии сохраняются, и доступны на любых страницах сайта.

Например, на странице http://ox2.ru/index.php мы записали в сессию ‘session_test’ значение ‘123’. На странице http://ox2.ru/shop.php мы можем прочитать сессию session_test, и получить значение 123.

Для работы с сессиями на php нужно на каждой странице где будет производиться работа с сессиями написать session_start(), в самом начале, до вывода любой информации на экран.

Для записи в сессии существует переменная $_SESSION.

Например, простой пример:

Файл index.php будет запись в сессию:

Файл session.php будет чтение сессии:

Вот в этом простом примере показана работа с сессиями.

Создание авторизации на PHP

Сейчас мы создадим пример авторизации. Основную функцию будет выполнять класс AuthClass.

Вот код с пояснением:

Конечно это самый простой пример создание авторизации на php. Пароли и имена пользователей должны браться из базы данных, шифроваться в MD5, и т.д. Более сложные примеры создания авторизации будут в следующих статьях.

Сессии очень полезны не только при разработке интернет-магазинов, но и при создании сайтов.
Можно придумывать различные фишки, правда стоимость создания сайта может резко увеличиться. Но это того стоит, т.к. интересный и функциональный сайт привлечет к себе много клиентов и постоянных посетителей.

Комментарий:
Большое спасибо

Комментарий:
Всё отлично работает, спасибо! Но такой вопрос:
private $_login = "demo"; //Устанавливаем логин

У меня никак не выходит вместо "demo" прицепить внешнюю переменную. Подскажите пожалуйста, как туда её передать? чтобы можно было авторизовывать не 1-го человека, а много пользователей сверив соответствующие данные не статически, а с переменной.

Комментарий:
При авторизации логин заносится в $_SESSION[‘чего то там’]. в данном случае — $_SESSION["login"].
Это суперглобальный массив, который доступен на любой странице.
Можно взять имя содержимое нужного элемента на нужной вам странице.

Или можно посмотреть весь массив вот через такую функцию.
function Test_ShowArr($text) <
foreach($text as $key=>$val)
<
echo $key."=>".$val."
";
>
>

Комментарий:
Сергей, для простого вывода используй конструкцию вида: getLogin(); ?>
Например,

Комментарий пользователя getLogin(); ?>

А вот для записи комментария в БД примерно так:
getLogin();
$result = mysql_query("INSERT INTO . (. username) VALUES (. ‘$username’)");
.
?>
Если понял что это — хорошо, нет — гугли работа с БД

Авторизация на сессиях PHP и MySQL


Итак, как я и обещал, сегодня я расскажу как сделать свою авторизацию используя session, php и mysql. Для начала определимся что такое сессия и чем она отличается от cookie.
Session – это механизм, позволяющий однозначно идентифицировать браузер и создающий для этого браузера файл на сервере, в котором хранятся переменные сеанса.
Cookies — это механизм хранения данных броузером удаленного компьютера для идентификации возвращающихся посетителей и хранения параметров веб-страниц.
Т.е. главное различие это место хранения данных, у сессий на стороне сервера, у куков на стороне клиента, это различие критично. Если украсть у пользователя cookie довольно просто то с сессиями не все так просто. Ну а теперь перейдем к практической части а именно к написанию своей авторизации.
Для начала определим имена файлов:

  • config.php — хранит данные для подключения к Базе Данных ( далее БД )
  • functions.php — содержит в себе все функции для работы авторизации
  • join.php — простейший пример регистрации пользователя в системе
  • login.php — служит для входа в систему
  • logout.php — служит для выхода из системы
  • members.php — служит для проверки авторизации ( простейший пример «закрытой» части сайта
Читайте также:  Программа для клавиатуры блуди

Для начала создадим БД и таблицу где будут храниться данные пользователей.

SQL дамп таблицы пользователей

config.php

Что содержит данный файл я уже говорил, поэтому просто приведу его код.

functions.php

Самый большой файл из всех в данной статье, содержит все функции. Приведу исходный код а потом прокомментирую каждую функцию.

function connectToDB ( ) <
global $link , $dbhost , $dbuser , $dbpass , $dbname ;
( $link = mysql_pconnect ( " $dbhost " , " $dbuser " , " $dbpass " ) ) || die ( "Couldn’t connect to MySQL" ) ;
mysql_select_db ( " $dbname " , $link ) || die ( "Couldn’t open db: $dbname . Error if any was: " . mysql_error ( ) ) ;
>

function newUser ( $login , $password ) <
global $link ;

$query = "INSERT INTO users (login, password) VALUES(‘ $login ‘, ‘ $password ‘)" ;
$result = mysql_query ( $query , $link ) or die ( "Died inserting login info into db. Error returned if any: " . mysql_error ( ) ) ;

function displayErrors ( $messages ) <
print ( "Возникли следующие ошибки:

    " ) ;

foreach ( $messages as $msg ) <
print ( "

  • $msg
    " ) ;
    >
    print ( "
  • " ) ;
    >

    function checkLoggedIn ( $status ) <
    switch ( $status ) <
    case "yes" :
    if ( ! isset ( $_SESSION [ "loggedIn" ] ) ) <
    header ( "Location: login.php" ) ;
    exit ;
    >
    break ;
    case "no" :
    if ( isset ( $_SESSION [ "loggedIn" ] ) && $_SESSION [ "loggedIn" ] === true ) <
    header ( "Location: members.php" ) ;
    >
    break ;
    >
    return true ;
    >

    function checkPass ( $login , $password ) <
    global $link ;

    $query = "SELECT login, password FROM users WHERE login=’ $login ‘ and password=’ $password ‘" ;
    $result = mysql_query ( $query , $link )
    or die ( "checkPass fatal error: " . mysql_error ( ) ) ;

    if ( mysql_num_rows ( $result ) == 1 ) <
    $row = mysql_fetch_array ( $result ) ;
    return $row ;
    >
    return false ;
    >

    function cleanMemberSession ( $login , $password ) <
    $_SESSION [ "login" ] = $login ;
    $_SESSION [ "password" ] = $password ;
    $_SESSION [ "loggedIn" ] = true ;
    >

    function flushMemberSession ( ) <
    unset ( $_SESSION [ "login" ] ) ;
    unset ( $_SESSION [ "password" ] ) ;
    unset ( $_SESSION [ "loggedIn" ] ) ;
    session_destroy ( ) ;
    return true ;
    >

    function field_val >( $field_descr , $field_data , $field_type , $min_length = "" , $max_length = "" , $field_required = 1 ) <

    if ( ! $field_data && ! $field_required )

    $data_types = array (
    "email" => $email_regexp ,
    "digit" => "^[0-9]$" ,
    "number" => "^[0-9]+$" ,
    "alpha" => "^[a-zA-Z]+$" ,
    "alpha_space" => "^[a-zA-Z ]+$" ,
    "alphanumeric" => "^[a-zA-Z0-9]+$" ,
    "alphanumeric_space" => "^[a-zA-Z0-9 ]+$" ,
    "string" => ""
    ) ;

    if ( $field_type == "string" ) <
    $field_ok = true ;
    > else <
    $field_ok = ereg ( $data_types [ $field_type ] , $field_data ) ;
    >

    if ( ! $field_ok ) <
    $messages [ ] = "Пожалуйста введите нормальный $field_descr ." ;
    return ;
    >

    А теперь по порядку

    • function connectToDB() — служит для подключения к базе данных
    • function newUser($login, $password) — служит для создания нового пользователя в системе
    • function displayErrors($messages) — выводит массив ошибок
    • function checkLoggedIn($status) — проверяет авторизацию пользователя.
    • function checkPass($login, $password) — проверяет пользователя по БД во время авторизации
    • function cleanMemberSession($login, $password) — авторизует пользователя
    • function flushMemberSession() — выход, или если вам будет удобнее logout
    • function field_val >Работу каждой функции я описывать не буду, т.к. они довольно простые, в данный момент нас интересует только логика. Если будут вопросы — спрашивайте.

    join.php

    $title = "страница регистрации" ;

    if ( isset ( $_POST [ "submit" ] ) ) <
    field_val >( "login name" , $_POST [ "login" ] , "alphanumeric" , 4 , 15 ) ;
    field_val >( "password" , $_POST [ "password" ] , "string" , 4 , 15 ) ;
    field_val >( "confirmation password" , $_POST [ "password2" ] , "string" , 4 , 15 ) ;

    if ( strcmp ( $_POST [ "password" ] , $_POST [ "password2" ] ) ) <

    $messages [ ] = "Ваши пароли не совпадают" ;
    >

    $query = "SELECT login FROM users WHERE login=’" . $_POST [ "login" ] . "’" ;

    $result = mysql_query ( $query , $link ) or die ( "MySQL query $query failed. Error if any: " . mysql_error ( ) ) ;

    if ( ( $row = mysql_fetch_array ( $result ) ) ) <
    $messages [ ] = "Логин " " . $_POST [ "login" ] . " " уже занят, попробуйте другой." ;
    >

    if ( empty ( $messages ) ) <
    newUser ( $_POST [ "login" ] , $_POST [ "password" ] ) ;

    cleanMemberSession ( $_POST [ "login" ] , $_POST [ "password" ] ) ;

    header ( "Location: members.php" ) ;

    if ( ! empty ( $messages ) ) <
    displayErrors ( $messages ) ;
    >
    ?>

    Рекомендуем к прочтению

    Добавить комментарий

    Ваш адрес email не будет опубликован.