- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -

LinuxovΘ noviny 07/98

Chyby u╛ivatel∙ pat°φ u╛ivatel∙m

Milan ⌐orm, 9. Φervence 1998

Umo╛nil jsem tak jako mnoh² sprßvce u╛ivatel∙m vytvß°et vlastnφ webovΘ strßnky a zve°ej≥ovat je b∞╛nou konvencφ. Rovn∞╛ jsem jim dovolil psßt si vlastnφ CGI skripty. A to s sebou nese jeden zßsadnφ problΘm.

Chyby CGI skript∙ jsou standardn∞ zapisovßny do chybovΘho v²stupu Apache, resp. cel² chybov² v²stup (STDERR) je p°ipojen do tohoto souboru s identifikacφ skriptu a Φasu vzniku problΘmu.

Jen╛e chyba v u╛ivatelskΘm skriptu zajφmß p°edev╣φm u╛ivatele, kter² skript vytvß°φ. Nehled∞ k tomu, ╛e se potom na partition, na kterΘ se uklßdajφ systΘmovΘ logy, objevujφ zßznamy u╛ivatel∙ a oni majφ teoreticky mo╛nost tuto partition zahltit.

Existuje vφce °e╣enφ tohoto problΘmu. Zßkladnφm °e╣enφm, kterΘ °e╣φ informovanost u╛ivatele i zat∞╛ovßnφ centrßlnφ log∙, je nesystΘmovΘ u╛φvßnφ p°esm∞rovßnφ chybovΘho vstupu n∞kam jinam samotn²m tv∙rcem CGI skriptu. Nap°. v Perlu se nask²tajφ p∞knΘ mo╛nosti p°i u╛itφ CGI::Carp Φi Tie::STDERR|. ProΦ je toto °e╣enφ nesystΘmovΘ? Proto╛e ponechßvßme na v∙li tv∙rce, jestli toto vyu╛φvß.

JinΘ °e╣enφ, kterΘ °e╣φ jen informovanost u╛ivatel∙, spoΦφvß v jednorßzovΘ kontrole chybovΘho logu Apache nap°. veΦer. NalezenΘ chyby u╛ivatel∙ jsou jim potom n∞jak²m zp∙sobem p°edßny (zaslßny mailem, p°ipojeny do souboru chyb apod.). Ani toto °e╣enφ nenφ ideßlnφ, i kdy╛ jej lze kombinovat s promazßvßnφm logu p°φp. zkrßcenφm doby kontroly nap°. na jedinou minutu.

Za nejlep╣φ variantu pova╛uji mo╛nost nasadit na chybov² v²stup Apache pr∙b∞╛n² filtr. Jß nejsem Apachem nucen psßn v╣echny chyby do souboru, ale mohu si je nechat posφlat do filtru, kter² bude tyto chyby prochßzet a rozesφlat p°φslu╣n²m u╛ivatel∙m Φi zapisovat do systΘmovΘho logu.

Jak se to provede? Do °ßdku ErrorLog v souboru httpd.conf se mφsto jmΘna souboru uvede |/usr/sbin/analerrorlog. To je samoz°ejm∞ kolonovß konvence (trubkovß znφ lΘpe ;-) nßsledovanß jmΘnem filtru. Filtr bude spu╣t∞n jen jedenkrßt (p°i startu Apache) a po celou dobu b∞hu jsou mu na standardnφ vstup p°edßvßny ·daje, kterΘ by chodily do error_logu.

Toto je nap°. standardnφ jedno°ßdkov² chybov² v²pis p°i neexistenci strßnky:

[Wed Jul 8 18:48:20 1998] access to\
/www/htdocs/plan.htm failed for \
infra.euroseek.net, reason: File does not exist

Toto se ulo╛φ v hlavnφm error_logu, kter²m se probφrß nß╣ webmaster.

A te∩ komplexn∞j╣φ ukßzka z u╛ivatelsk²ch CGI skript∙, kdy╛ nastane chyba:

Illegal division by zero at\
 /home/popelnik/html/perl/passwd.pl line 35.
[Tue Jul 7 07:47:53 1998] access to\
 /~popelnik/passwd.cgi failed for \
mensa.physics.muni.cz, reason:\
 Premature end of script headers

Toto se ulo╛φ k u╛ivateli do jeho error_log souboru.

Bohu╛el °ßdek, kter² oznaΦuje, ve kterΘm skriptu k chyb∞ do╣lo, p°ijde v╛dy a╛ jako poslednφ. Proto je nutnΘ si zapamatovat v╣echny prochßzejφcφ °ßdky a╛ po °ßdek zaΦφnajφcφ hranatou zßvorkou (nap°. v souboru). Z hranatΘ zßvorky lze ji╛ snadno rozpoznat, komu skript pat°φ (za znakem nßsleduje login u╛ivatele) a je mo╛nΘ mu p°φslu╣nß data zaslat (mailem, ulo╛enφm do n∞jakΘho souboru v jeho home adresß°i apod.). Pokud se nenajde u╛ivatel, komu by chyba pat°ila, m∙╛e se ulo╛it do p∙vodnφho chybovΘho souboru.

Filtr navφc m∙╛e p°evßd∞t Redirect ·daje a Alias ·daje zp∞t na p∙vodnφ majitele (pokud mßte nap°. konvenci s pln²mi jmΘny u╛ivatel∙ namφsto s loginy) Φi ignorovat n∞kterΘ chyby (typicky v∞ci obsahujφcφ °et∞zce "send body", "lingering close", "lost connection", "connection reset by peer", "fixed spelling" Φi jmΘna robot∙ - vyhledßvaΦ∙.

Vhodn²m jazykem pro napsßnφ filtru je nap°. Perl. Pr∙b∞╛n∞ lze chyby mφsto v souboru zachycovat v pam∞ti (pole) a na zßv∞r vyklopit nap°. p°es sendmail u╛ivateli do po╣ty. A to se potom chybujφcφ u╛ivatel nad sv²m CGI skriptem rychle zamyslφ.

Samoz°ejm∞ lze stejn² zp∙sob aplikovat i na soubor p°φstup∙ (access_log) a zaznamenßvat si transakce, ale to lep╣φ °e╣it dßvkov∞ a data dßvkov∞ p°enß╣et do graf∙. Alespo≥ si to tak myslφm jß. *


- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -