RkBlog

Hardware, programming and astronomy tutorials and reviews.

Formularze i Adresy

Interaktywne aplikacje PHP odbierają od użytkownika setki informacji. Pozwalają one nie tylko zorientować się, kto nas odwiedził, ale także odczytywać zawartość formularzy oraz adresów URL. Mechanizm ich odbierania ewoluował stopniowo. Pierwsze wersje rejestrowały wszystkie nadesłane parametry jako zwyczajne zmienne, lecz począwszy od PHP 4 zarzucono to, gdyż zagrażało bezpieczeństwu wielu skryptów. Dodając nowe parametry można było rejestrować nowe zmienne, które mogły nadpisać zmienne używane w kodzie aplikacji powodując jego błędne działanie (np. zyskanie praw administratora strony przez atakującego). Programista nie mógł także policzyć, ile danych w ogóle do niego trafiło i w jakich zmiennych są zawarte. Obecnie wszystkie pola są rejestrowane w specjalnych, tworzonych przez skrypt, tablicach asocjacyjnych posegregowane według miejsca, z którego nadeszły. PHP potrafi odbierać informacje: Tutaj zajmiemy się trzema pierwszymi pozycjami.

Register_globals

W PHP4 i 5 istnieje w konfiguracji PHP dyrektywa register_globals, która jeżeli jest włączona powoduje rejestrowanie zmiennych otrzymanych z formularzy, odnośników, ciastek czy sesji jako zmienne globalne, co stwarza potencjalne niebezpieczeństwo dla aplikacji. Opcja ta powinna być wyłączona, a skrypt powinny korzystać z omawianych poniżej tablic. Nie należy stosować skryptów wymagających włączonych register_globals. W PHP6 dyrektywa ta zostanie usunięta podobnie jak safe_mode.

Adresy URL

Dane pochodzące z adresu URL przechowywane są w tablicy $_GET. Możemy prosto obejrzeć sobie jej konstrukcję:
<pre><?php
print_r($_GET);
?>
Wywołując skrypt normalnie: "http://localhost/ścieżka/nazwaskryptu.php" otrzymamy pustą tablicę. Wywołanie strony ze zmiennymi, np.: "http://localhost/ścieżka/nazwaskryptu.php?klucz=wartosc&zmienna2=123" spowoduje wyświetlenie zawartości tablicy $_GET, która zawierać będzie dwie wartości. Kluczami będą "klucz" i "zmienna2" a wartościami odpowiednio "wartosc" i "123". Zmienne $_GET stosowane są do określania czynności jakie skrypt powinien wykonać (wyświetlić artykuł, listę wiadomości). Zmienne te łatwo zmodyfikować modyfikując odnośnik, tak więc należy zwrócić szczególną uwagę na filtrację i walidację danych z $_GET.

Formularze

Obsługa formularzy z prawdziwego zdarzenia, którymi można przesyłać setki informacji, odbywa się dosyć podobnie, jak adresów. Różnica jest taka, że wszystko wysyła się wyłącznie z formularza, który posiada parametr "method" ustawiony na "post" (a nie "get") oraz że korzysta się z tablicy $_POST wewnątrz samego skryptu.
<?php
   if(count($_POST) == 2)
   {
      echo 'Witaj, '.$_POST['imie'].' '.$_POST['nazwisko'].'!';
   }
   else
   {
      echo 'Nieprawidłowa liczba parametrów!';
   }
 ?>
<html>
  <head>
   <title>Formularz HTML</title>
  </head>
  <body>
    <form method="post" action="nazwaskryptu.php">
    Podaj imię: <input type="text" name="imie"/><br/>
    Podaj nazwisko: <input type="text" name="nazwisko"/><br/>
    <input type="submit" value="OK"/>   
    </form>
  </body>
 </html>

I gotowe. Wyślij teraz formularz.

Z kursów języka HTML wiadomo, że istnieją różne typy pól formularzy. Oto, jakie wartości otrzymuje od nich PHP:

<input type="text" name="nazwa"/>
skrypt otrzymuje $_POST['nazwa'] z wartością wpisaną w pole formularza.
<input type="hidden" name="nazwa"/>
skrypt otrzymuje $_POST['nazwa'] z wartością wpisaną w danym znaczniku. Użyteczne do przesyłania formularzem ukrytych informacji, o których typowy użytkownik wiedzieć nie musi.
<input type="radio" name="nazwa"/>
pozycje należące do tej samej grupy muszą mieć identyczną nazwę. PHP otrzyma wartość tej pozycji, która jest aktualnie zaznaczona.
<input type="checkbox" name="nazwa"/>
jeśli pole jest zaznaczone, $_POST['nazwa'] zawierać będzie słowo "on".
<select name="nazwa">...</select>
$_POST['nazwa'] zawierać będzie wartość wybranego z listy elementu.
<input type="submit" name="nazwa"/>
zmienna $_POST['nazwa'] zostanie utworzona, jeżeli akurat ten przycisk zostanie wciśnięty. Dzięki temu można do formularzy wstawiać kilka przycisków "submit" i reagować inaczej w zależności od tego, który z nich został naciśnięty.

Na podstawie kursu PHP na Wikibooks, licencja GNU Free Documentation License

RkBlog

Podstawy PHP, 14 July 2008, Piotr Maliński

Comment article