Hibakezelés
A PHP biztonsági kérdések felől a hibajelzéseknek két oldaluk van. Az egyiket nézve hasznos a védelem növelése szempontjából, a másik szemszögből viszont káros.
Egy szokásos támadási technika minél több információ begyűjtése a rendszerrÅ‘l. Ezt úgy próbálják megoldani, hogy helytelen adatokat küldenek be, és rögzÃtik a hibaüzenetek tÃpusait és környezetüket. Ez lehetÅ‘séget ad a crackernek, hogy elég információt gyűjtsön a rendszerrÅ‘l, és meghatározza a lehetséges gyenge pontokat. Ha például a támadó összeszedegetett elég információt az elÅ‘zÅ‘ űrlap kitöltések alapján, akkor megpróbálhatja a változókat felülÃrni vagy megváltoztatni Å‘ket:
Example#1 Változók elleni támadás egy HTML oldallal
<form method="post" action="tamadas_celpontja?usernev=rosszize&jelszo=rosszize">
<input type="hidden" name="usernev" value="rosszize">
<input type="hidden" name="jelszo" value="rosszize">
</form>
A PHP által visszaadott hibaüzenetek általában hasznosak a hibákat keresÅ‘ fejlesztÅ‘ számára, megjelölve a fájlt, és a függvényt, ami hibás, megadva a megfelelÅ‘ programsor számát. Ez az összes információ, amit ki lehet nyerni. Nem ritka, hogy egy PHP fejlesztÅ‘ a show_source(), highlight_string(), vagy highlight_file() függvényeket a fejlesztés során hibakeresésre is használja, de egy élesben lévÅ‘ webhelyen ez rejtett változókat, ellenÅ‘rizetlen kódokat, és más veszélyes információkat fedhet fel. Kifejezetten veszélyes beépÃtett hibakezelÅ‘vel rendelkezÅ‘ ismert forrású kódok használata. Ha a támadó ráismer valamilyen általános programozási technikára, akkor megpróbálhatja a nyers erÅ‘re alapozva feltörni az oldalt a különbözÅ‘ megszokott hibakeresÅ‘ (debugging) változók elküldésével:
Example#2 Szokványos hibakereső változók kihasználása
<form method="post" action="tamadas_celpontja?errors=Y&showerrors=1&debug=1">
<input type="hidden" name="errors" value="Y">
<input type="hidden" name="showerrors" value="1">
<input type="hidden" name="debug" value="1">
</form>
A hibakezelés módjától függetlenül az a lehetőség, hogy egy rendszerben hibák után kuthatnak, odavezet, hogy a támadók is több információhoz jutnak.
Az általános hibaüzenetek nagyrészébÅ‘l például beazonosÃtható, hogy a rendszer PHP-t használ. Ha a támadó egy .html oldalt látott, és ismert hibákat kihasználva meg akarta tudni, hogy milyen alkalmazást használ a rendszer, hibás adatokat beküldve azonosÃthatja, hogy az oldalt egy PHP program állÃtotta elÅ‘.
Egy függvényhiba elárulhatja, hogy a rendszer milyen adatbázismotort használ, vagy hogy milyen programozói stÃlussal készült az adott weblap. Ez mélyebb kutatásokra ad lehetÅ‘séget nyitott adatbázisportok irányában, vagy tipikus hibák illetve gyengeségek keresését jelentheti. KülönbözÅ‘ hibás adatok küldésével a támadó meg tudja állapÃtani, hogy milyen sorrendben végzed az azonosÃtásokat (a hibák sorszámaiból). Ezzel a gyenge pontok is könnyen megtalálhatóak egy szkriptben.
A fájlrendszer vagy általános PHP hibák jelezhetik, hogy milyen jogokkal rendelkezik a webszerver, és megmutathatják a fájlok elrendezését és struktúráját. A fejlesztÅ‘ által Ãrt hibás kód súlyosbÃthatja a helyzetet, egykori 'rejtett' információk könnyű kiderÃtését téve lehetÅ‘vé.
Három megoldási lehetőség adódik erre a problémára. Az első, megvizsgálni alaposan a függvényeket, és megpróbálni elkerülni a hibákat. A második a a hibajelzés kikapcsolása a teljes kódon belül. A harmadik a PHP testreszabható hibajelentési funkcióinak használata, hogy saját hibakezelőket definiálj. A már megtett biztonsági intézkedésektől függően esetleg mindhárom fenti módszert választható.
MegelÅ‘zendÅ‘ a bajt hasznot hajthat a PHP beépÃtett error_reporting() függvénye, amely segÃt biztonságosabbá tenni a programokat és megtalálni a változók vészelyeket rejtÅ‘ használati formáit. A bevezetés elÅ‘tti tesztelés során E_ALL beálllÃtással gyorsan meg lehet találni azokat a pontokat, ahol a változók könnyen és/vagy rosszindulatúan módosÃthatók. Ha a program már kész bevezetésére, teljesen kikapcsolhatod a hibajelentést az error_reporting() 0-ra állÃtásával, vagy kikakpcsolod a hibák megmutatását a php.ini display_errors opciójával, ezzel teljesen leszigetelve a kódot a további vizslatásoktól. Ha az utóbbit választod, meg kell adnod a naplófájl útvonalát az error_log ini direktÃvával, majd a log_errors direktÃvát on-ra kell állÃtanod.
Example#3 Veszélyes változók felderÃtése az E_ALL segÃtségével
<?php
if ($usernev) { // nincs inicializálva vagy ellenőrizve használat előtt
$jo_belepes = 1;
}
if ($jo_belepes == 1) { // ha az előző feltétel hamis, nincs inicializálva vagy ellenőrizve használat előtt
fpassthru ("/nagyon/kenyes/adatok/index.html");
}
?>