[ Pobierz całość w formacie PDF ]
.Tryb kontroli ska¿eñPrzyjrzawszy siê bli¿ej, mo¿na dostrzec, ¿e przyk³adowe skrypty w tym rozdziales¹ nieco inne ni¿ w przyk³adach wczeœniejszych.Ró¿nica pojawia siê na pocz¹tkupierwszego wiersza.Wszystkie poprzednie przyk³ady mia³y nastêpuj¹cy pierwszywiersz:#!/usr/bin/perl -wTW tym rozdziale zaczynaj¹ siê nastêpuj¹co:# !/usr/bin/perl -wRó¿nica polega na opcji -T, w³¹czaj¹cej w Perlu tryb kontroli ska¿eñ.W trybierym Perl œledzi dane przychodz¹ce od u¿ytkownika i unika wykonywania na nichwszelkich niebezpiecznych operacji.Poniewa¿ przyk³ady z tego rozdzia³u mia³yna celu zademonstrowanie niebezpiecznego postêpowania, nie dzia³a³yby zprze³¹cznikiem -T i dlatego go pomijaliœmy.Ju¿ st¹d jasno widaæ, ¿e trybkontroli ska¿eñ generalnie jest bardzo po¿yteczny.Zadaniem tego trybu jest niedopuszczenie do tego, aby jakiekolwiek dane spozaaplikacji mia³y wp³yw na cokolwiek na zewn¹trz aplikacji.Dlatego Perl niezezwoli, aby dane wprowadzone przez u¿ytkownika zosta³y poddane dzia³aniuinstrukcji eoal, przetworzone przez pow³okê lub u¿yte w jakimkolwiek poleceniuPerla, które oddzia³uje na zewnêtrzne pliki i procesy.Tryb ten zosta³stworzony na wypadek sytuacji, w których bezpieczeñstwo odgrywa bardzo du¿¹rolê: na przyk³ad przy pisaniu programów w Perlu dzia³aj¹cych jako u¿ytkownikroot lub skryptów CGI.W skryptach CGI zawsze nale¿y siê pos³ugiwaæ trybemkontroli ska¿eñ.Na czym polega mechanizm ska¿eñGdy tryb kontroli ska¿eñ jest w³¹czony, Perl monitoruje ka¿d¹ zmienn¹ pod k¹temska¿enia.Dane ska¿one, wed³ug specyfikacji Perla, to wszelkie dane, którepochodz¹ spoza kodu.Poniewa¿ wliczyæ tu nale¿y wszystko, co jest odczytywane zSTDIN (lub z dowolnego innego wejœcia plikowego), oraz wszystkie zmienneœrodowiska, pojêde to obejmuje wszelkie dane, które skrypt CGI otrzymuje odu¿ytkownika.Perl nie tylko œledzi, czy zmienne s¹ ska¿one, lecz tak¿e to, czy wraz zprzypisaniem jednej zmiennej ska¿enie przenosi siê z niej na inn¹ zmienn¹.Przyk³adowo: Perl uznaje, ¿e metoda ¿¹dania HTTP przechowywana w zmiennej $ENV{REQUEST_METHOD} jest ska¿ona, poniewa¿ jest to zmienna œrodowiska.Jeœli terazprzypiszemy j¹ do innej zmiennej, równie¿ i ona stanie siê ska¿ona.my $metoda = $ENV(REQUEST_METHOD)Tutaj ska¿enie przenoszone jest na zmienn¹ $metoda.Nie ma znaczenia, czywyra¿enie jest proste czy skomplikowane.Jeœli ska¿ona wartoœæ zostaje u¿yta wwyra¿eniu, ska¿eniu ulega wynik wyra¿enia, a ka¿da zmienna, do której zostanieon przypisany, tak¿e stanie siê ska¿ona.W celu sprawdzenia, czy zmienna jest ska¿ona, mo¿na siê pos³u¿yæ poni¿sz¹procedur¹.[14 Podrêcznikowa strona perlsec do sprawdzania ska¿eñ zalecaprocedurê opart¹ na funkcji Perla kill.Niestety, w wielu systemach funkcjakill nie dzia³a.Podana tu procedura powinna dzia³aæ niezale¿nie odplatformy.]Zwraca ona wartoœæ „prawda" lub „fa³sz".sub czy_skazona {my $var = shift;my $pustka = substrf $var, 0, 0 );return not eval { eval "1 || $pustka" || 1 };}Do zmiennej $ pustka przypisujemy zerowej d³ugoœci pod³añcuch sprawdzanejzmiennej.Jeœli wartoœæ jest ska¿ona, a tryb kontroli ska¿eñ jest w³¹czony, togdy w nastêpnym wierszu poddamy obliczeniom zawartoœæ cudzys³owu, Perlzasygnalizuje b³¹d.B³¹d zostaje wy³apany przez zewnêtrzn¹ (poza klamrami)instrukcjê eval, która zwraca wtedy undef.Jeœli zmienna nie jest ska¿ona lubtryb kontroli ska¿eñ jest wy³¹czony, wyra¿enie obejmowane przez zewnêtrzneeval da wynik l.Operator not odwraca wartoœæ wyniku.Co jest nadzorowane w trybie kontroli ska¿eñWielk¹ zalet¹ trybu kontroli ska¿eñ jest to, ¿e nie musimy znaæ wszystkichtechnicznych szczegó³Ã³w dotycz¹cych wewnêtrznych mechanizmów Perla.Jakwidzieliœmy, Perl niekiedy poprzez zewnêtrzn¹ pow³okê przekazuje wyra¿enia,wspomagaj¹c interpretacjê argumentów kierowanych do wywo³añ systemowych.Zdarzaj¹ siê jeszcze trudniej uchwytne sytuacje, w których Perl wywo³ujepow³okê, lecz nie musimy siê martwiæ rozpoznawaniem wszystkich tych przypadków,poniewa¿ tryb kontroli ska¿eñ sam je rozpoznaje.Przede wszystkim Perl uznaje za potencjalnie szkodliwe ka¿de dzia³anie, któremo¿e zmodyfikowaæ zasoby na zewn¹trz skryptu.Dlatego pos³uguj¹c siê ska¿on¹nazw¹ pliku mo¿na otworzyæ plik, i odczytaæ jego zawartoœæ, jeœli tylko odbywasiê to w trybie tylko do odczytu.Jeœli jednak pos³uguj¹c siê ska¿on¹ nazw¹spróbujemy otworzyæ plik z mo¿liwoœci¹ zapisu, Perl przerwie wykonanie i zg³osib³¹d.Jak siê pozbyæ ska¿eniaTryb kontroli ska¿eñ by³by zbyt restrykcyjny, gdyby nie by³o sposobu odka¿eniadanych.Oczywiœcie nie zale¿y nam na odka¿aniu danych bez uprzedniegosprawdzenia, czy s¹ one bezpieczne.Tak siê dobrze sk³ada, ¿e jednympoleceniem mo¿emy zrealizowaæ obydwa zadania.Okazuje siê, ¿e w Perlu jednowyra¿enie, w którym wystêpuj¹ ska¿one wartoœci, po przetworzeniu mo¿e daæwartoœæ nieska¿on¹.Jeœli test na dopasowanie zmiennej przeprowadzamy przyu¿yciu wyra¿enia regularnego, to pseudozmienne z wynikami dopasowywania wed³ugwzorca podanego w nawiasie okr¹g³ym (tj.$1, $2 itd.) bêd¹ nieska¿one
[ Pobierz całość w formacie PDF ]