
Ile razy tworzymy prostą stronę w PHP, która ma doczytywać podstrony dzięki include wstawionemu w odpowiednim miejscu, tyle razy używamy specyficznych adresów w których wysyłamy odpowiednie instrukcje do serwera. Najczęściej zmienna id (np. http://7pl.info/index.php?podstrona=kontakt) określa którą stronę chcemy wyświetlić. Zmienną przysłaną na serwer należy przechwycić, poddać analizie w instrukcji SWITCH, która wyświetli odpowiednią podstronę i gotowe.
Porównajmy poniższy kod:
$podstrona = $_REQUEST['podstrona']; switch ($podstrona){ case 'oferta': include 'podstrony/oferta.php'; break; case 'kontakt': include 'podstrony/kontakt.php'; break; default : include 'podstrony/404.php'; }
Z tym:
switch ($podstrona){ case 'oferta': include 'podstrony/oferta.php'; break; case 'kontakt': include 'podstrony/kontakt.php'; break; default : include 'podstrony/404.php'; }
Robią to samo, a drugi nie ma odwołania do tablicy REQUEST. Napisałem wcześniej, że zmienną należy przechwycić, ale PHP robi to za nas. Zmienna $podstrona jest tworzona automatycznie przy wywołaniu adresu index.php?podstronastrona=kontakt, nie trzeba więc przechwytywać wartości zmiennej ze wspomnianej tablicy, ale nie jest to rozwiązanie, a jedynie ciekawostka PHP. Z tablicy REQUEST możemy bowiem wyciągnąć znacznie więcej - także wartości wysłanych zmiennych z formularzy, których nie widać w pasku adresu. Dodam jeszcze, że zmienne tworzą się automatycznie po ich wywołaniu poprzez żądanie wysłane na serwer, ale są to tylko zmienne o nazwie identycznej z tą w adresie. Dzięki REQUESTowi możemy zrobić coś takiego:
$podstrona = $_REQUEST['id']; switch ($podstrona){ case 'oferta': include 'podstrony/oferta.php'; break; case 'kontakt': include 'podstrony/kontakt.php'; break; default : include 'podstrony/404.php'; }
Teraz możemy operować krótkimi i enigmatycznymi zmiennymi w pasku adresu, a w kodzie PHP reprezentować je już w czytelnych zmiennych. Oczywiście zamiast REQUESTa możemy użyć odwołania się do tablicy $_GET, ale ja używam pierwszej metody.
Po dłuższej rozmowie z Adriano dałem się przekonać, że lepiej mieć kontrolę nad tym co pobieramy i nie zdawać się na uniwersalną tablicę $_REQUEST tylko na konkretne tablice $_GET oraz $_POST. Spójrzmy na ten prosty kod XHTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <div id="haselko"> <form action="rozwalamy_request.php" method="post"> <fieldset> <input type="text" name="haslo" /> <input type="submit" /> </fieldset> </form> </div> </body> </html>
A teraz przypatrzmy się kodowi z pliku do którego wysyłamy dane z formularza:
<?php $status = $_REQUEST['haslo']; if ($status != 'hacked'){ $status = 'safe'; } echo 'Site status: '. $status; ?>
Zatrzymajmy się na chwilę... Wysyłamy hasło POSTem i potem czytamy dane z tablicy REQUEST. Spróbujmy jednak wywołać taki adres: nazwastrony.pl/rozwalamy_request.php?haslo=hacked i widzimy, że wstrzyknięcie danych to nic trudnego... Korzystając z tablicy $_POST pozbędziemy się tej dziury. Oczywiście jest to tylko prosty przykład - nie stosuje się takich rozwiązań w zastosowaniach produkcyjnych!
Procek
| « poprzednia | następna » |
|---|
Prowadzącym ten blog jest od 6 lat Krzysztof "Procek" Ścira - Obecnie student AGH. Blog traktujący o szeroko pojętej IT - można tu poczytać o zagadnieniach związanych z m. in. programowaniem, grafiką, hardware i systemami operacyjnymi. Warto dodać kanał RSS tego bloga do swojego czytnika.[Więcej]