[Procek@Blog /]$ Programowanie Automatycznie tworzące się zmienne w PHP

Reklama

Recenzje

Automatycznie tworzące się zmienne w PHP

php

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';
  }
 

Analiza kodu

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';
  }
 

Różne zmienne w adresie i 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.

Odpowiednia tablica podnosi bezpieczeństwo

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

Dodaj komentarz

W komentarzach możesz używać następujących tagów:
[b][/b], [url][/url], [quote][/quote]
Wypowiedzi obraźliwe oraz nie odnoszące się do tematu będą moderowane – pisząc postaraj się zwiększyć wartość dyskusji.
Komentarze nie służą do zgłaszania ofert, informowania o błędach, itd. W tym celu proszę o kontakt mailowy.


Kod antysapmowy
Odśwież