Wyższa Szkoła Technologii Teleinformatycznych w Świdnicy Internetowe bazy danych wykład 6 dr inż. Jacek Mazurkiewicz e-mail: Jacek.Mazurkiewicz@pwr.wroc.pl
Kontrola dostępu <?php if(!isset($user) &&!isset($haslo)) { // użytkownik podlega identyfikacji?> <h1>zaloguj się</h1> Strona zastrzeżona <form method = post action = achtung.php > <table border = 1> <tr> <th> Użytkownik </th> <td> <input type = text name = user> </td> </tr> <tr> <th> Hasło </th> <td> <input type = password name = haslo> </td> </tr> <tr> <td colspan = 2 align = center> <input type = submit value Zaloguj się > </td> </tr> </form>
<?php else if($user == uzytkownik && $haslo == haslo ) { // identyfikacja poprawna echo Możesz zobaczyć stronę ; else { // identyfikacja niepoprawna echo Nie zobaczysz strony ;?> Zasadnicze wady rozwiązania: akceptacja tylko jednego użytkownika i jednego hasła zapisanego w kodzie hasło przechowywane w formie otwartego tekstu ochrona tylko jednej strony internetowej przesyłanie hasła w formie otwartego tekstu
Przechowywanie haseł dostępu w skrypcie trudna modyfikacja, dostępność zbyt duża w pliku lepiej z kontrolą niepowołanych, problem gdy dużo w bazie danych dobry dostęp, łatwość modyfikacji create database wiara; use wiara; create table zawodnik ( user varchar(20) not null, haslo varchar(30) not null, ); insert into zawodnik values ( testman, test098 ); grant select, insert, update, delete on wiara.* to hans@localhost identified by J23 ; Tworzenie bazy w MySQL
<?php else { $connect = mysql_connect( localhost, hans, J23 ); if(!$connect) { echo Brak połączenia ; exit; $zap = select * from zawodnik where user like $user and haslo like $haslo ; $wynik = mysql_query($zap); if(!wynik) { echo Coś nie tak ; exit; $ile = mysql_num_rows($wynik); if($ile > 0) { echo Możesz zobaczyć stronę ; /* identyfikacja OK. */ else { echo Nie zobaczysz strony ; /* identyfikacja zła */?>
Zasadnicze wady rozwiązania: hasło przechowywane w formie otwartego tekstu ochrona tylko jednej strony internetowej przesyłanie hasła w formie otwartego tekstu Szyfrowanie hasła: w PHP funkcja crypt: string crypt (string łańcuch [, string klucz]) zwraca pseudolosowy ciąg znaków, nie można odwrócić procesu, ale to samo wejście i klucz dają ten sam który można porównać w MySQL funkcja password: string password (string) zwraca pseudolosowy ciąg znaków, nie można odwrócić procesu, szyfrowanie odbywa się według pewnego algorytmu mieszającego
Szyfrowanie hasła z PHP if($user == uzytkownik && $haslo == haslo ) { // identyfikacja OK. if($user == uzytkownik && crypt($haslo, xx ) == xxvcgpmnm2g9c ) { // identyfikacja OK. Szyfrowanie hasła z MySQL insert into zawodnik values ( testman, test098 ); $zap = select * from zawodnik where user like $user and haslo like $haslo ; $zap = select * from zawodnik where insert into zawodnik values user like $user and ( testman, password( test098 )); haslo like password( $haslo )
Zasadnicze wady rozwiązania: ochrona tylko jednej strony internetowej <?php if(substr($server_software, 0, 9) == Microsoft &&!isset($php_auth_user) &&!isset($php_auth_pw) && substr($http_authorization, 0, 6) == Basic ) { list($php_auth_user, $PHP_AUTH_PW) = explode( :, base64_decode(substr($http_authorization, 6))); // zamiast if może być zapytanie do bazy if ($PHP_AUTH_USER!= uzytkownik $PHP_AUTH_PW!= haslo { // użytkownik nie podał danych albo coś się nie zgadza header( WWW-Authenticate: Basic realm= Nazwa zasobu ); if(substr($server_software, 0, 9) == Microsoft ) header( Status: 401 Unathorized ); else header( HTTP/1.0 401 Unauthorized ); echo Nie zobaczysz strony ; else echo Możesz zobaczyć stronę ;?>
Moduł mod_auth_mysql (1) źródło: www.zend.com, www.mysql.com/downloads/contrib.html po rozpakowaniu katalog mod_auth_mysql, polecenie: configure ze ścieżką do serwera MySQL i Apache:./configure --with-mysql=/var/mysql --with-apache=/src/apach polecenie make install z parametrem: --activate-module=src/modules/auth_mysql/libauth_mysql.a założenie baz i tabeli do trzymania danych uwierzytelniających, mogą być to bazy dowolne w pliku httpd.conf dodać linię pozwalającą na łączenie z serwerem MySQL: Auth_MySQL_Info komputer użytkownik haslo uruchomienie Apache: /usr/local/apache/bin/apachectl startssl
Moduł mod_auth_mysql (2) plik.htaccess definiuje uwierzytelnianie z danych MySQL Auth_MySQL_DB - baza uwierzytelniania Auth_MySQL_Encryption_Types sposób szyfrowania haseł Auth_MySQL_Password_Field tablica haseł Auth_MySQL_Username_Field loginy użytkowników hasło dostępu do serwera MySQL w skrypcie PHP - ochrona zabezpieczeniami serwera WWW konfiguracja serwera WWW - *.php są przetwarzane tylko przez PHP, nikt z zewnątrz nie podgląda ich zawartości konfiguracja serwera WWW pojedynczy użytkownik może uruchomić skrypt, każdy pracuje na odrębnej kopii serwera
Cookies co to jest cookie? małe fragmenty tekstu wysyłane do przeglądarki użytkownika pomocne w tworzeniu koszyka zakupów, personalizacji witryn nie przechowują danych jawnych, mogą zawierać łańcuch identyfikacyjny łączący użytkownika z danymi w bazie danych tworzenie cookies określić jak będą wykorzystywane i kiedy będą ustawione ustawiać zawsze przed wysłaniem jakichkolwiek danych przeglądarki bo to część informacji nagłówka
setcookie( ) definicja pojedynczego pakietu Nazwa: nazwa zmiennej przechowywanej w tablicy globalnej $HTTP_COOKIE_VARS dostępna w kolejnych skryptach Wartość: wartość zmiennej przekazanej w parametrze nazwa Data ważności: ustala określony czas, po jego upłynięciu wartość cookie przestaje być dostępna, jeśli daty brak cookie traci ważność wraz z zamknięciem przeglądarki Ścieżka: określa katalogi, dla których pakiet cookie jest ważny, pojedynczy ukośnik pakiet cookie ważny dla wszystkich plików i katalogów na serwerze WWW Domena: cookie ważne tylko dla danego lokalnego hosta i domeny która je ustawiła, brak domeny nazwa hosta, który wygenerował cookie, poprawna domena minimum 2 kropki Bezpieczeństwo: jeśli 1 cookie transmitowany poprzez HTTPS
Cookies - przykład setcookie( id, 55sds809892jjsj2, time()+14400, /,.twojadomena.com, 0); wartość Time() + 60 Time() + 900 Time() + 1800 Time() + 3600 Time() + 14400 Time() + 43200 Time() + 86400 Time() + 259200 Time() + 604800 Time() + 2592000 definicja Godz + 1 min Godz + 15 min Godz + 30 min Godz + 1 godz Godz + 4 godz Godz + 12 godz Godz + 24 godz Godz + 3 dni Godz + 1 tydz Godz + 30 dni
Tworzenie testowego Cookie <?php $cookie_name = test_cookie ; $cookie_value = test spring! ; $cookie_expire = time()+86400; $cookie_domain =.twojadomena.com ; setcookie($cookie_name, $cookie_value, $cookie_expire, /, $cookie_domain, 0);?> <HTML> <HEAD> <TITLE>Set Test Cookie</TITLE> </HEAD> <BODY> <H1>Mmmmmmmm... Cookie!<H1> </BODY> </HTML> zapisać pod nazwą.php warto w przeglądarce ustawić informowanie o cookies
Cookie w uwierzytelnianiu (1) <?php $connect = mysql_connect( localhost, hans, J23 ); if(!$connect) { echo Brak połączenia ; exit; $zap = select * from zawodnik where user like $user and haslo like $haslo ; $wynik = mysql_query($zap); if(!wynik) { echo Coś nie tak ; exit; $ile = mysql_num_rows($wynik); if($ile > 0) { $cookie_name = auth ; $cookie_value = ok ; $cookie_expire = ; $cookie_domain = ; setcookie($cookie_name, $cookie_value, $cookie_expire, /, $cookie_domain, 0);
Cookie w uwierzytelnianiu (2) $display_block = <P><strong>Tajne menu:</strong></p> <ul> <li><a herf=\ secreta.php\ >tajna strona A</a> <li><a herf=\ secretb.php\ >tajna strona B</a> </ul> ; echo $display_block ; else { echo Nie zobaczysz strony ; /* identyfikacja zła */?> jeśli uwierzytelnianie się powiedzie ustawi się cookie o nazwie auth i wartości ok. ważność wygaśnie wraz z końcem sesji przeglądarki cookie będzie ważne dla wszystkich katalogów na lokalnym hoście
Cookie w uwierzytelnianiu (3) <?php if ($auth == ok ) { $msg = <P>Witamy uwierzytelnionego użytkownika na tajnej stronie A</P> ; else { header( Location: http://localhost/login.html ); exit;?> <HTML> <HEAD> secretb.php <TITLE>Secret page A</TITLE> </HEAD> <BODY> <?php echo $msg ;?> </BODY> </HTML> secreta.php