pozycjonowanie Dodawarka do katalogów katalogowanie
W połowie roku 1999 ukazał się oficjalnie Zend Engine, nowy silnik języka skryptowego, wokół którego niedługo później zaczęto budować PHP 4. Jego nazwa to kompromisowe połączenie imion twórców projektu. Nowa, oparta o niego wersja PHP ukazała się w maju 2000 roku. Tak jak poprzednio, był to potężny krok naprzód. Programiści mieli do dyspozycji teraz wiele nowych narzędzi, konstrukcji językowych oraz bezpieczniejszy system wejścia/wyjścia. Od strony administracyjnej pojawiło się oficjalne wsparcie dla wielu nowych serwerów.


forum forex
Skuteczna gra na giełdzie walutowej
Prognozy i analizy rynków finansowych
www.forexday.pl
tapety ścienne
Ciekawe wzory nowoczesnych fototapet
Tapety zmywalne odporne na światło
www.ardeko.pl
Inwestowanie na giełdzie
Lokowanie pieniędzy na wysoki procent
Zamiast do banku warto grać na giełdzie
www.lfinvestments.eu
Wulkanizacja Warszawa
Dobry warsztat, wysoka jakość usług
Dobrze wyposażony warsztat mechaniczny
www.dobrymechanik.pl


Upośledzenie umysłowe
Człowiek upośledzony to nie imbecyl
Stopniowanie i klasyfikacja choroby
www.mretardation.bulok.info
Irlandia praca
Glazurnicy, malarze poszukiwani do pracy
Zatrudnienie w przemyśle ciężkim
www.praca-irlandia.com


Pojawił się całkowicie nowy model programowania obiektowego co spowodowało utratę pełnej kompatybilności z poprzednimi wersjami PHP. W ramach tego modelu, zmieniony został sposób reprezentacji obiektów. W wersjach wcześniejszych obiekt był jednocześnie zmienną, co sprawiało duże trudności, dlatego też w wersji 5 na wzór Javy zmienna obiektowa stała się jedynie referencją do właściwego obiektu. Operacja przypisania = powoduje jedynie powstanie drugiej referencji wskazującej na ten sam obiekt.

Rozdział 34. Uwierzytelnianie HTTP w PHP

Uwierzytelnianie HTTP jest obsługiwana przez PHP tylko wtedy, gdy PHP pracuje jako moduł Apache'a, nie jest dostępna w trybie CGI. W skrypcie można użyć funkcji header() by wysłać do przeglądarki komunikat "Wymagana autoryzacja", co spowoduje wyświetlenie okienka z polami Użytkownik i Hasło. Po wypełnieniu przez użytkownika tych pól, URL zawierający skrypt PHP zostanie ponownie wywołany z ustawionymi predefiniowanymi zmiennymi PHP_AUTH_USER, PHP_AUTH_PW i PHP_AUTH_TYPE zawierającymi odpowiednio nazwę użytkownika, hasło i typ autoryzacji. Zmienne te będą dostępne w tablicach $_SERVER oraz $HTTP_SERVER_VARS. Obecnie obsługiwana jest jedynie autoryzacja typu "Basic". Więcej informacji znajdziesz w opisie funkcji header().

Przykładowy skrypt wymuszający autoryzację klienta:

Przykład 34-1. Uwierzytelnianie HTTP

<?php
  
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    
header('WWW-Authenticate: Basic realm="My Realm"');
    
header('HTTP/1.0 401 Unauthorized');
    echo
'Tekst do wysłania, jeśli użytkownik wciśnie przycisk Anuluj';
    exit;
  } else {
    echo
"<p>Hej {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo
"<p>Twoje hasło to {$_SERVER['PHP_AUTH_PW']}.</p>";
  }
?>

Kompatybilność: Należy uważać z linijkami dodawanymi do nagłówka HTTP. W celu zachowania maksymalnej zgodności ze wszystkimi klientami, słowo Basic powinno zaczynać się dużą literą "B", wartość realm powinna być otoczona cudzysłowami (nie apostrofami), i dokładnie jeden znak odstępu powinien poprzedzać kod 401 w linii HTTP/1.0 401.

Zamiast wyświetlać wartość PHP_AUTH_USER i PHP_AUTH_PW, jak to zrobiono w powyższym przykładzie, zechcesz zapewne sprawdzić poprawność nazwy użytkownika i hasła. Na przykład poprzez zapytanie do bazy danych lub odnalezienie użytkownika w pliku dbm.

Należy uważać na kapryśne przeglądarki Internet Explorer. Są wrażliwe na kolejność wysyłanych nagłówków HTTP. Wysłanie nagłowka WWW-Authenticate przed HTTP/1.0 401 powinno rozwiązać problem.

Aby zapobiec sytuacji w której ktoś napisze skrypt wykradający hasło wysłane tradycyjnym zewnętrznym mechanizmem, zmienne PHP_AUTH nie będą ustawiane, jeśli dla danej strony aktywna jest autoryzacja zewnętrzna. W tym wypadku, aby uzyskać nazwę użytkownika zautoryzowanego zewnętrznie, należy skorzystać ze zmiennej REMOTE_USER. Zatem, $_SERVER['REMOTE_USER'].

Konfiguracja: Aby wykryć czy miała miejsce zewnętrzna autoryzacja, PHP sprwadza obecność dyrektywy AuthType. Pamiętaj zatem, by nie stosować tej dyrektywy w miejscach, gdzie będzie używana autoryzacja PHP. Inaczej każda próba autoryzacji zakończy się niepowodzeniem.

Powyższa metoda nie zapobiega jednak wykradaniu haseł do stron wymagających autoryzacji przez kogoś, kto na tym samym serwerze kontroluje strony nie wymagające autoryzacji.

Zarówno Netscape Navigator jak i Internet Explorer opróżnią bufor autoryzacji po otrzymaniu od serwera kodu 401. Można w ten sposób wylogowanić użytkownika i zmusić go do ponownego wysłania nazwy użytkownika i hasła. Tej metody można użyć do wylogowania użytkownika po określonym czasie lub stworzenia przycisku "Wyloguj".

Przykład 34-2. Uwierzytelnianie HTTP z wymuszeniem przelogowania

<?php
  
function authenticate() {
    
header('WWW-Authenticate: Basic realm="Testowy system autoryzacji"');
    
header('HTTP/1.0 401 Unauthorized');
    echo
"Musisz podać poprawny login i hasło by wejść na tę stronę\n";
    exit;
  }

  if (!isset(
$_SERVER['PHP_AUTH_USER']) || ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
   
authenticate();
  }
  else {
   echo
"<p>Witaj: {$_SERVER['PHP_AUTH_USER']}<br>";
   echo
"Poprzenio: {$_REQUEST['$OldAuth']}";
   echo
"<form action='{$_SERVER['PHP_SELF']}' METHOD='POST'>\n";
   echo
"<input type='hidden' name='SeenBefore' value='1'>\n";
   echo
"<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}'>\n";
   echo
"<input type='submit' value='Re Authenticate'>\n";
   echo
"</form></p>\n";
  }
?>

Powyższa metoda nie jest wymagana przez autoryzację HTTP typu "Basic", więc nie można na niej polegać. Testy z przeglądarką Lynx pokazały, że Lynx nie usuwa danych o autoryzacji po odebraniu od serwera kodu 401, zatem przejście wstecz a następnie do przodu otworzy stronę, chyba, że wymagania co do danych autoryzacji zmieniły się. Użytkownik może jednak użyć klawisza '_' by usunąc dane o autoryzacji.

Uwierzytelnianie HTTP nie działa w połączeniu z serwerem Microsoft IIS i PHP w wersji CGI. Powodem są pewne ograniczenia IIS.

Notatka: Jeśli włączony jest tryb bezpieczny, uid skryptu jest doklejany do pola realm nagłówka WWW-Authenticate.