Logowanie i rejestracja w PHP, czyli sesje oparte na ciasteczkach

Mateusz Nowak
21.08.2015

Podczas prowadzenia strony www, częto myślimy o stworzeniu jakiejś komunikacji między użytkownikami, czy po prostu chcemy udostępnić pewne treści dla zalogowanych użytkowników. Czasami też chodzi nam o ograniczenie transferu, aby przypadkowy internauta nie ładował większych plików, np. zdjęcia, awatary, pliki z downloadu. W tym artykule przedstawię Wam dość prosty, ale też dość bezpieczny system rejestracji i logowania oraz przedstawię Wam dwie funkcje, które wyświetlają treści dla użytkowników zalogowanych i niezalogowanych. Będziemy korzystać z bazy MySQL.

Zaczniemy od skryptu rejestracji. Po pierwsze, formularz:

 

Login:
E-mail:
Hasło:
Powtórz hasło:

   type="submit">
 

rejestracja.html

Formularz składa się z pól: login, E-mail, hasło i powtórz hasło. Dane z tego formularza będziemy przekazywać do pliku rejestruj.php. Skrypt rejestracji nie tylko będzie dodawał odebrane dane do bazy, ale też sprawdzi, czy login nie jest już zajęty, czy zawiera odpowiednie znaki, a także, czy podane hasła się zgadzaja i nie było pomyłki. Ponadto sprawdzimy, czy konstrukcja adresu E-mail jest poprawna i czy także nie jest już taki w bazie. Poniżej przedstawiam skrypt, postaram się wszystko omówić:

 

//funkcja dodajaca dane do bazy:
        function rejestruj($nick, $haslo, $email){
        $sql = mysql_query("insert into `uzytkownicy` (`id`, `nick`, `haslo`, `email`) values ('', '$nick', '$haslo', '$email')");    
        return true;
        }
//funkcja sprawdzajaca poprawnosc adresu email:
    function poprawny_email($email){
    if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email)){
    return false;
    } else {
    return true;
    }
    }
   
//funkcja sprawdzajaca, czy login zawiera dozwolone znaki
    function poprawny_login($login){
    if (!ereg("^[a-zA-Z0-9]+$",$login)){
    return false;
    } else {
        return true;
    }
    }

//funkcja sprawdza, czy login nie jest juz zajety   
    function login_wolny($login){
    $sql = mysql_query("select * from `uzytkownicy` where `nick` = '$login'");   
    $liczba = @mysql_num_rows($sql);
    if($liczba > 0){
        return false;
    } else {
        return true;
    }   
    }

//funkcja sprawdza, czy email nie jest juz zajety       
    function email_wolny($email){
    $sql = mysql_query("select * from `uzytkownicy` where `email` = '$email'");   
    $liczba = @mysql_num_rows($sql);
    if($liczba > 0){
        return false;
    } else {
        return true;
    }   
    }
//funkcja sprawdzajaca zgodnosc obu hasel oraz czy zostaly podane:   
    function porownaj_hasla($haslo1, $haslo2){
    if($haslo1 == $haslo2 && $haslo1 !== '' && $haslo2 !== '' && $haslo1 !== null && $haslo2 !== null){   
    return true;   
    } else {
        return false;
    }
    }       
       
       
//odpowiednio przefiltrowane dane z formularza       
 $login = strip_tags($_POST['login']);
 $email = strip_tags($_POST['email']);
 $haslo = strip_tags($_POST['haslo']);
 $haslo2 = strip_tags($_POST['haslo2']);
 
 
//uzywamy funkcji sprawdzajacych:

if(poprawny_email($email) && poprawny_login($login) && porownaj_hasla($haslo, $haslo2)){
    if(login_wolny($login) && email_wolny($email)){
   
    //rejestrujemy nowego uzytkownika
                  rejestruj($login, md5($haslo), $email);
           echo 'Zarejstrowano nowego użytkownika '.$login.'. Witamy!';
  }
  else
  //w przeciwnym razie wyswietlamy komunikaty o bledach:
  {
  echo 'Login lub E-mail jest już w bazie';
   }

 } else {
 echo 'Podaj poprawne dane';
 }

?>

rejestruj.php

I teraz od początku. Funkcja rejestruj dodaje nowego użytkownika do bazy, nie trzeba chyba nic tłumaczyć, ale zanim doda, wszystkie dane muszą być sprawdzone. Funkcja sprawdz_email sprawdza, czy konstrukcja adresu email jest poprawna, czyli uzytkownik@adres.poczty. Funkcja poprawny_login sprawdza, czy podany login zawiera w sobie wyłącznie litery i cyfry. Dwie ostatnie funkcje wykorzystują wyrażenia regularne. Następna funkcja to login_wolny, która sprawdza, czy login nie jest zajęty. Szuka w bazie danych podanego loginu, jeżeli nie znajdzie, to znaczy że login jest wolny i można do dodać, tak samo jest z funkcją email_wolny. Ostatnia funkcja porownaj_hasla sprawdza, czy podane hasła są takie same, jeżeli wszystko się zgadza, można rejestrować użytkownika, jeżeli wszystkie funkcje zwrócą true. W przeciwnym wypadku skrypt wyświetli odpowiednie komunikaty i napotkanych błędach. To wszystko, jeżeli chodzi o skrypt rejestracji ;)

Następną częścią naszego systemu jest logowanie. Skrypt tworzy sesję, dzięki której możemy się dostać do treści dostępnych wyłącznie dla zalogowanych użytkowników. Poniżej zamieszczam formularz i skrypt:

 

 

 

Login:

             

            Hasło:

            

            

 

logowanie.html

 

    function loguj($login, $haslo){
    if(!session_is_registered("uzytkownik")){
    $zap1=mysql_query("select * from `uzytkownicy`  WHERE `nick` = '$login' and `haslo` = '$haslo' ");   
    if(mysql_num_rows($zap1) > 0){
    session_register("uzytkownik");
    $_SESSION['login'] = $login;   
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

    } else {
        return false;
        }
    } else {
        return false;
        }   
    }

if(strip_tags($_POST['loguj']) == 'Zaloguj'){
$login = strip_tags($_POST['login']);
$haslo = strip_tags(md5($_POST['haslo']));

loguj($login, $haslo);

if(loguj($login, $haslo) == false){
$blad_login = 'Zły login lub hasło
';   
echo $blad_login;
}

}
?>

loguj.php


Na samym początku zadeklarowaliśmy funkcję loguj. Sprawdza ona, czy login i hasło są poprawne, czyli szuka w bazie rekordu o takim haśle i loginie. Jeżeli znajdzie, to znaczy że dane są poprawne i można rozpoczynać sesję, w innym wypadku wyświetli błąd. Sesję nazwaliśmy "uzytkownik". W ciasteczkach zapisujemy także IP, które potem użyjemy do zabezpieczenia sesji przed kradziejem :D
No i system rejestracji i logowania jest już gotowy. Teraz musimy napisać dwie funkcje, które będa wyświetlać treści dla użytkowników zalogowanych i niezalogowanych:

 

function zalogowany($tekst){
if(session_is_registered("uzytkownik")){
echo "$tekst";
}
}

    function niezalogowany($tekst){
if(!session_is_registered("uzytkownik")){
echo "$tekst";
}
}

Myślę, że nie trzeba tu zbyt dużo tłumaczyć, znak "!" to znak negacji, czyli jeżeli warunek nie jest spełniony. Jeszcze tylko zabezpieczamy sesję przed kradzieżą (skrypt umieszczamy na samym początku strony):

 

if(session_is_registered("uzytkownik")){
if($_SESSION['ip'] !== $_SERVER['remote_addr']){
die('Zabezpieczenie zostalo aktywowane!');
}
}

Powyższy kod sprawdza, czy IP komputera jest takie samo, jak IP, na którym się zalogowano, czyli inaczej mówiąc sprawdza, czy nikt nie przeniósł naszej sesji na swój komputer.

Dodatkowy możemy stworzyć plik (a raczej musimy), który niszczy sesję, czyli wylogowuje użytkownika. Wystarczy zapisać plik wyloguj.php a w treści:

 

session_destroy();
echo 'Wylogowano.';
?>

wyloguj.php
Cały system jest już gotowy, poniżej jeszcze zamieszczam przykładowy dokument, który korzysta z systemu:

if(session_is_registered("uzytkownik")){
if($_SESSION['ip'] !== $_SERVER['remote_addr']){
die('Zabezpieczenie zostalo aktywowane!');
}
}


    function zalogowany($tekst){
    if(session_is_registered("uzytkownik")){
    echo "$tekst";
    }
    }
   
        function niezalogowany($tekst){
    if(!session_is_registered("uzytkownik")){
    echo "$tekst";
    }
    }


niezalogowany('

Login:

             

            Hasło:

            

            

lub Zarejestruj się');

zalogowany('Witaj '.$_SESSION['login'].'!
Wyloguj się');

 

Skrypt SQL tworzący tabelę:

 

create table `uzytkownicy`(
`id` int(11) not null auto_increment,
`nick` varchar(255) not null,
`haslo` varchar(255) not null,
`email` varchar(255) not null,
primary key(`id`)
)

Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie