POWRÓT NA STRONĘ SZKOŁY

Uwierzytelnienie za pomocą PHP i MySQL

Podstawowym problemem jest bezpieczne przechowywanie haseł dostępu. Można przechowywać je w pliku i o tym już mówiliśmy. Przyjmuje się, że jeżeli niezbędne jest przechowywanie więcej jak 100 pozycji, to należy je zapisać w bazie danych. Zastosowanie bazy do przechowywania identyfikatorów uzytkowników oraz ich haseł nie skomplikuje za bardzo skryptu, natomiast znacznie przyspieszy operacje uwierzytelniania. Niezależnie od tego, gdzie będziemy przechowywać hasła, to obowiązkowo należy je zaszyfrować. Podczas zapisywania haseł w pliku oraz ich odczytu, stosowaliśmy szyfrowanie jednostronne, za pomocą funkcji md5(). PHP dysponuje również silniejszą funkcją sha1. W przypadku zapisywania hasła w bazie danych możemy również zastosować funkcję MySQL o tej samej nazwie SHA1().

Ćwiczenie 12_0_0_1. Utworzenie przykładowej bazy z hasłami użytkowników

Tworzenie bazy danych ksiegarnia_internetowa zostało omówione podczas niedawnych zajęć. Przypominam, że powinniśmy mieć zarejestrowanego użytkownika z uprawnieniami administratora admin i haśle admin123. Teraz stosując phpMyAdmin uworzymy bazę uzytkownicy, składającą się z jednej tabeli hasla, w której wpiszemy dwóch przykładowych użytkowników. Dla uproszczenia kodu, zakładamy, że w nazwach i hasłach nie będziemy stosować "polskich ogonków". Należy zastosować następujacy kod SQL:

CREATE DATABASE uzytkownicy;
USE  uzytkownicy;
CREATE TABLE hasla
(
  uzytkownik VARCHAR(20) NOT NULL,
  haslo VARCHAR(40) NOT NULL,
  PRIMARY KEY(uzytkownik)
);
INSERT INTO hasla VALUES
('uzytkownik1',SHA1('haslo1')),
('uzytkownik2',SHA1('haslo2'));
Utworzenie bazy danych użytkowników
Rysunek 12_0_0_1. Utworzenie bazy danych użytkowników

Zwróć uwagę hasła, które są zapisane w postaci zaszyfrowanej. W tabeli hasla mamy użytkowników:

  • uzytkownik1, który ma hasło haslo1,
  • uzytkownik2, który ma hasło haslo2.

Ćwiczenie 12_0_0_2. Logowanie na stronie za pomocą MySQL - metoda proceduralna

Tym razem "załatwimy" wszystko w jednym pliku logowanie.php. Mówiliśmy na wcześniejszych zajęciach, że biblioteka mysqli umożliwia obiektową jak również proceduralną obsługę MySQL. W tym ćwiczeniu zastosujemy rozwiązanie proceduralne.


Po wpisaniu do formularza loginu i hasła i wciśnięciu Zaloguj, powinniśmy otrzymać odpowiedni komunikat.

Strona logowania
Rysunek 12_0_0_2. Strona logowania

Oto plik logowanie.php:

<!doctype html>
<html>
  <head>
    <title>Logowanie z wykorzystaniem MySQL</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <form action="logowanie.php" method="post">
      Login<input type="text" name="login" />
      Hasło<input type="password" name="haslo" />
      <input type="submit" name="logowanie"  value="Zaloguj" />
    </form>
    <br />
  
  <?php
    //jeżeli nie ma wysłanych danych, to zakończ skrypt
    if (!isset($_POST['login']) || !isset($_POST['haslo'])) exit;
    $login=trim($_POST['login']);
    $haslo=trim($_POST['haslo']);
    if (empty($login) || empty($haslo)) 
    {
      echo 'Brak loginu lub hasła!';
      exit;
    }
    $mysql=mysqli_connect('localhost','admin','admin123');
    //połączenie z MySQL
    if (!$mysql)
    {
      echo 'Brak połączenia z MySQL!';
      exit;
    }
    $baza=mysqli_select_db($mysql,'uzytkownicy');
    //wybór potrzebnej bazy
    if (!$baza)
    {
      echo 'Brak połączenia z bazą uzytkowników!';
      exit;
    }
    $haslo=sha1($haslo);//zaszyfrowanie hasła
    //znajdowanie pasującego wiersza
    $zapytanie="select count(*) from hasla where uzytkownik='$login' and haslo='$haslo'";
    $wynik=mysqli_query($mysql,$zapytanie);
    if (!$wynik)
    {
      echo 'Błąd w wykonaniu zaytania!';
      exit;
    }
    $wiersz=mysqli_fetch_row($wynik);
    $ile_znaleziono=$wiersz[0];
    if ($ile_znaleziono>0) echo 'Jesteś zalogowany'; 
    else echo 'Podałeś błędny login lub hasło!';    
  ?>
</html>
  • Zwróć uwagę, że w ujęciu proceduralnym operujemy nie na obiektach, lecz na zasobach. Uchwyty do tych zasobów przekazujemy jako parametry funkcji o nazwach rozpoczynających się od mysqli.... Takim zasobem jest u nas $mysql.
  • Funkcja SQL COUNT(*) zwraca liczbę rekordów w tabeli.

Ćwiczenie 12_0_0_3. Logowanie na stronie za pomocą MySQL - podejście obiektowe

Wykonamy ponownie poprzednie ćwiczenie, stosując tym razem obiektowy interfejs biblioteki mysqli.

Plik logowanie.php, przyjmie tym razem postać:

<!doctype html>
<html>
  <head>
    <title>Logowanie z wykorzystaniem MySQL</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <form action="logowanie.php" method="post">
      Login<input type="text" name="login" />
      Hasło<input type="password" name="haslo" />
      <input type="submit" name="logowanie"  value="Zaloguj" />
    </form>
    <br />
  
  <?php
    //jeżeli nie ma wysłanych danych, to zakończ skrypt
    if (!isset($_POST['login']) || !isset($_POST['haslo'])) exit;
    $login=trim($_POST['login']);
    $haslo=trim($_POST['haslo']);
    if (empty($login) || empty($haslo)) 
    {
      echo 'Brak loginu lub hasła!';
      exit;
    }
    //połączenie z MySQL
    @ $baza=new mysqli('localhost','admin','admin123','uzytkownicy');
    if (mysqli_connect_errno())
    {
      echo 'Brak połączenia z MySQL!';
      exit;
    }
    $haslo=sha1($haslo);//zaszyfrowanie hasła
    //znajdowanie pasującego wiersza
    $zapytanie="select * from hasla where uzytkownik='$login' and haslo='$haslo'";
    $wynik=$baza->query($zapytanie);
    $ile_znaleziono=$wynik->num_rows;
    if ($ile_znaleziono>0) echo 'Jesteś zalogowany'; 
    else echo 'Podałeś błędny login lub hasło!';    
    $wynik->free();
    $baza->close();
  ?>
</html>

Wszystkie pojęcia i metody występujące w tym ćwiczeniu, były omawiane wcześniej.

Pokazane formularze logowania są bardzo proste. Ciekawszy wygląd można uzyskać po zastosowaniu CSS, pokazuje to ćwiczenie 3_2_15_1 w opracowaniu podstaw HTML5