PHP/Obsługa ciastek: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Zyx (dyskusja | edycje)
rozbudowa materiałów o ciastka i nagłówki.
Zyx (dyskusja | edycje)
dokończenie
Linia 119:
?></nowiki>
=== Funkcje buforowania wyjścia ===
Istnieją sytuacje, kiedy musimy wysłać jakiś kod HTML przed wysłaniem nagłówków HTTP, jednak tradycyjne metody nie pozwalają to. W PHP można ten problem omijać, używając funkcji buforowania wyjścia. Najogólniej rzecz biorąc, przechwytują one treść wysyłaną przez '''echo''' albo '''print''', zapisując ją do specjalnego bufora. Opróżniamy go samodzielnie na samym końcu skryptu, symulując efekt równoczesnego wysyłania nagłówków i kodu HTML. Pokażemy to na przykładzie:
 
<nowiki><?php
ob_start();
echo '<h1>Tytuł witryny</h1><p>I inne komendy HTML.</p>';
setcookie('wizyta', time(), time() + 30 * 86400);
if(!isset($_COOKIE['wizyta']))
{
echo '<p>Witaj, gościu.</p>';
}
else
{
echo '<p>Witaj, ostatni raz odwiedziłeś nas '.date('d.m.Y, H:i', $_COOKIE['wizyta']).'</p>';
}
ob_end_flush();
?></nowiki>
 
Zwróć uwagę, że przed stworzeniem ciastka skrypt wysyła już kod HTML. Dlatego wszystkie instrukcje zawarliśmy między funkcjami ''ob_start()'' i ''ob_end_flush()''. Pierwsza inicjuje buforowanie wyjścia, a druga kończy je, wysyłając jego zawartość do przeglądarki.
 
Buforowanie wyjścia może też posłużyć do celów algorytmicznych, kiedy musimy przechwycić wysyłany kod, aby go jeszcze dodatkowo obrobić. Naraz można mieć otwartych kilka buforów działających zgodnie z zasadą stosu, tj. ostatni otwarty bufor będzie pierwszym, z którego pobierzemy zawartość. Poniżej prezentujemy mały skrypt cenzorski. Przechwytuje on tekst i cenzuruje go, chyba że internauta zna sposób aktywujący prawdziwą treść. Jest to coś w sam raz dla walczących z dyktaturami opozycjonistów.
 
<nowiki><?php
ob_start();
echo '<p>Pan Jan Nowak jest bardzo nieprzyzwoitym człowiekiem. Powiada, że dzień bez łapówki to
dzień stracony. Pracuje w urzędzie miejskim Obiektowa i nie wstydzi się swych podejrzanych interesów.</p>';
// CENZURA
// Pobieramy zbuforowany tekst
// I **dla czytelnosci** przykladu zapisujemy go w zmiennej
$kod = ob_get_clean();
if(isset($_GET['real']))
{
// Wtajemniczeni znaja cala prawde
echo $kod;
}
else
{
// Reszta moze sie tylko domyslac
echo str_replace(array(
'Jan Nowak',
'Obiektowo',
'Obiektowa'
), array(
'Alojzy Kromka',
'Hyzia Wólka',
'Hyziej Wólki'
), $kod);
}
?></nowiki>
 
Buforowanie wyjścia jest też podstawą tzw. kompresji GZip. Jest to kompresowanie treści strony przed wysłaniem tak, aby zajmowała mniejszą objętość, przez co użytkownik szybciej ją pobierze. Kompresję wspierają wszystkie nowoczesne przeglądarki (np. Opera, Firefox).
 
Aby uruchomić kompresję GZip, twoja wersja PHP musi mieć doinstalowaną bibliotekę ''zlib''. Wtedy możesz rozpocząć buforowanie poniższym kodem:
 
ob_start('ob_gzhandler');
ob_implicit_flush(0);
 
Parametr przekazywany do ''ob_start()'' to nazwa tzw. handlera służącego do modyfikacji zbuforowanej treści. ''ob_gzhandler'' jest jednym z predefiniowanych handlerów, zajmującym się właśnie kompresją GZip. Druga z funkcji nakazuje wywołanie handlera dopiero, gdy będziemy mieli już cały kod HTML. Musimy o niej pamiętać dlatego, że nie można skompresować danych wyjściowych partiami - musi to być przeprowadzone w sposób ciągły. PHP samodzielnie wykrywa, czy przeglądarka użytkownika posiada obsługę tej możliwości, dlatego nie musisz o tym pamiętać.
 
{{Infobox|tekst=Kompresja GZip może być także włączona "firmowo" w pliku ''php.ini'' dyrektywą ''zlib.output_compression''. Nie powinieneś wtedy wywoływać powyższych funkcji. Aby upewnić się, czy ustawienia interpretera na to pozwalają, musisz sprawdzić stan podanej dyrektywy funkcją ''ini_get()''}}
 
=== Ciastka a bezpieczeństwo ===
Ciastka są podstawą wielu systemów autoryzacji użytkowników dzięki możliwości przesyłania za ich pomocą danych między stronami. Jednak wielu początkujących programistów PHP nie rozumie lub nie wie, jak robić to bezpiecznie. Ciastko jest zwyczajnym nagłówkiem HTTP i naprawdę nie stanowi dużego problemu przechwycenie jego treści. Dlatego pamiętaj, aby '''nigdy''' nie przesyłać nim loginów, haseł zalogowanego użytkownika, ani żadnych innych danych potencjalnie pomocnych przy autoryzacji. Jest to całkowicie zła droga, gdyż systemy autoryzacji pisze się z wykorzystaniem sesji. Sesja jest pewnym rekordem z informacjami identyfikacji danego internauty przechowywanymi w bazie albo w pliku tekstowym na serwerze. Posiada długi, alfanumeryczny identyfikator i to on przesyłany jest ciastkiem. Porównując ID z ciastka, a także takie parametry, jak adres IP czy używana przeglądarka, można wyeliminować przypadki kradzieży ID sesji. Mechanizmu sesji nie musisz pisać samemu, gdyż PHP posiada własny. Omówimy go w następnym rozdziale.