A PHP 4.1.0 új adatbeviteli felülete
Legelőször ki szeretnénk hangsúlyozni, hogy a PHP 4.1.0 támogatja a korábbi verziók jól megszokott adatbeviteli mechanizmusát, tehát minden régebbi PHP szkriptnek gond nélkül kellene továbbra is működnie! Lássuk akkor az újdonságot:
A bekapcsolt register_globals változóra (ez azt jelenti, hogy az űrlapokból érkező, a szerver- és a környezeti változók automatikusan globálisak) épülő PHP szkriptek biztonsága különböző okok miatt változó méretben sérülékeny. Például a következő kód:
<php
if (authenticate_user()) {
$authenticated = true;
}
...
?>
sérülékeny, hiszen a felhasználók egyszerűen egy űrlap mezőjeként továbbíthatják az 'authenticated' értéket, és ekkor az $authenticated értéke 'igaz' lesz akkor is, ha az authenticate_user funkció 'hamis' értéket ad vissza.
Ez nagyon leegyszerűsített példának tűnik, de a valóságban nagyon sok PHP alkalmazás vált sebezhetővé ez a funkció miatt.
Habár egyáltalán nem lehetetlen biztonságos kódot írni PHP-ben, úgy éreztük, hogy az a tény, hogy a PHP túlságosan megkönnyíti a sebezhető kód írását, egyértelműen rossz, tehát messzehordó változásokat kell eszközölnünk, és meg kell szabadulnunk a register_globals változótól.
Egyértelmű, hogy mivel a PHP kód nagy része világszerte ezen funkció meglétére támaszkodik, a belátható jövőben nem tervezhetjük a funkció eltávolítását a PHP-ből, de úgy döntöttünk, hogy arra bátorítjuk az embereket, hogy amennyire csak lehet, szabaduljanak meg tőle. Annak érdekében, hogy segítsük a felhasználókat kikapcsolt register_global értékkel működő PHP alkalmazásokat írni, néhány új különleges változót vezettünk be, amelyek a régi globális változók helyett használhatóak.
7 új különleges tömb jelent meg:
$_GET - a GET-tel átküldött űrlap-változókat tartalmazza
$_POST - a POST-tal átküldött űrlap-változókat tartalmazza
$_COOKIE - a HTTP cookie (süti) változókat tartalmazza
$_SERVER - a szerverváltozókat (mint pl. REMOTE_ADDR) tartalmazza
$_ENV - a környezeti változókat tartalmazza
$_REQUEST - a GET, a POST és a cookie változók mindegyikét tartalmazza. Más szavakkal mindazt az információ, amely a felhasználótól érkezik, és amely a szkript biztonsága szempontjából nem megbízható.
$_SESSION - a session modul által regisztrált HTTP változókat tartalmazza.
Namost amellett, hogy ezek a változók ezeket a különleges információkat tartalmazzák, abban is különlegesek, hogy mindig globálisak. Azaz elérhetőek bárhonnan, a 'global' deklaráció nélkül. Például a:
function example1()
{
print $_GET["name"]; // működik, nincs szükség a 'global $_GET;'-re!
}
tökéletesen működik! Reméljük, hogy ez az újdonság csökkenti majd a régi kódról az újra való átállás fájdalmait, és meggyőződésünk, hogy jelentősen megkönnyíti majd az új kód írását.
Egy másik kis trükk az, hogy új bejegyzések létrehozása a $_SESSION tömbben automatikusan session változóként regisztrálja azokat, mintha csak a session_register() funkciót használtuk volna. Ez a trükk csak a session modulra érvényes - tehát pl. az $_ENV tömbben létrehozott új elemek nem felelnek meg a putenv() függvénynek.
A PHP 4.1.0 alapértelmezettként még mindig bekapcsolt register_globals változóval érkezik. Ez átmeneti állapot, és határozottan arra biztatjuk a fejlesztőket, különösen a nyilvános, széles közönség által használt alkalmazásokat fejlesztőket, hogy változtassák meg alkalmazásaikat, hogy azok a kikapcsolt register_globals-szal is működjenek. Persze ki kellene használniuk a PHP 4.1.0 új tulajdonságait, amelyek jelentősen megkönnyíthetik az átállást.
A PHP következő nagyobb verziójától kezdve az új verziók alapállapotban már mind kikapcsolt register_globals változóval érkeznek. De itt sem kell aggódni, a már létező telepítések, amelyekben a php.ini fájlban be van kapcsolva a register_globals, megtartják ezt az értéket. Csak a teljesen új telepítéseket (ami tipikusan teljesen új felhasználókat jelent) érinti ezt - és persze akkor is bekapcsolható az érték, ha a felhasználó úgy akarja.
Megjegyzés: ezen tömbök közül egyeseknek korábban is volt neve, mint pl. a HTTP_GET_VARS.
Ezek a nevek még mindig működnek, de arra bátorítjuk a felhasználókat, hogy inkább az új, rövidebb, auto-globális változókat használják.
Köszönet Shaun Clowes-nak (shaun##kukac##securereality.com.au) a probléma analizálásáért és felmutatásáért.
■ A bekapcsolt register_globals változóra (ez azt jelenti, hogy az űrlapokból érkező, a szerver- és a környezeti változók automatikusan globálisak) épülő PHP szkriptek biztonsága különböző okok miatt változó méretben sérülékeny. Például a következő kód:
<php
if (authenticate_user()) {
$authenticated = true;
}
...
?>
sérülékeny, hiszen a felhasználók egyszerűen egy űrlap mezőjeként továbbíthatják az 'authenticated' értéket, és ekkor az $authenticated értéke 'igaz' lesz akkor is, ha az authenticate_user funkció 'hamis' értéket ad vissza.
Ez nagyon leegyszerűsített példának tűnik, de a valóságban nagyon sok PHP alkalmazás vált sebezhetővé ez a funkció miatt.
Habár egyáltalán nem lehetetlen biztonságos kódot írni PHP-ben, úgy éreztük, hogy az a tény, hogy a PHP túlságosan megkönnyíti a sebezhető kód írását, egyértelműen rossz, tehát messzehordó változásokat kell eszközölnünk, és meg kell szabadulnunk a register_globals változótól.
Egyértelmű, hogy mivel a PHP kód nagy része világszerte ezen funkció meglétére támaszkodik, a belátható jövőben nem tervezhetjük a funkció eltávolítását a PHP-ből, de úgy döntöttünk, hogy arra bátorítjuk az embereket, hogy amennyire csak lehet, szabaduljanak meg tőle. Annak érdekében, hogy segítsük a felhasználókat kikapcsolt register_global értékkel működő PHP alkalmazásokat írni, néhány új különleges változót vezettünk be, amelyek a régi globális változók helyett használhatóak.
7 új különleges tömb jelent meg:
$_GET - a GET-tel átküldött űrlap-változókat tartalmazza
$_POST - a POST-tal átküldött űrlap-változókat tartalmazza
$_COOKIE - a HTTP cookie (süti) változókat tartalmazza
$_SERVER - a szerverváltozókat (mint pl. REMOTE_ADDR) tartalmazza
$_ENV - a környezeti változókat tartalmazza
$_REQUEST - a GET, a POST és a cookie változók mindegyikét tartalmazza. Más szavakkal mindazt az információ, amely a felhasználótól érkezik, és amely a szkript biztonsága szempontjából nem megbízható.
$_SESSION - a session modul által regisztrált HTTP változókat tartalmazza.
Namost amellett, hogy ezek a változók ezeket a különleges információkat tartalmazzák, abban is különlegesek, hogy mindig globálisak. Azaz elérhetőek bárhonnan, a 'global' deklaráció nélkül. Például a:
function example1()
{
print $_GET["name"]; // működik, nincs szükség a 'global $_GET;'-re!
}
tökéletesen működik! Reméljük, hogy ez az újdonság csökkenti majd a régi kódról az újra való átállás fájdalmait, és meggyőződésünk, hogy jelentősen megkönnyíti majd az új kód írását.
Egy másik kis trükk az, hogy új bejegyzések létrehozása a $_SESSION tömbben automatikusan session változóként regisztrálja azokat, mintha csak a session_register() funkciót használtuk volna. Ez a trükk csak a session modulra érvényes - tehát pl. az $_ENV tömbben létrehozott új elemek nem felelnek meg a putenv() függvénynek.
A PHP 4.1.0 alapértelmezettként még mindig bekapcsolt register_globals változóval érkezik. Ez átmeneti állapot, és határozottan arra biztatjuk a fejlesztőket, különösen a nyilvános, széles közönség által használt alkalmazásokat fejlesztőket, hogy változtassák meg alkalmazásaikat, hogy azok a kikapcsolt register_globals-szal is működjenek. Persze ki kellene használniuk a PHP 4.1.0 új tulajdonságait, amelyek jelentősen megkönnyíthetik az átállást.
A PHP következő nagyobb verziójától kezdve az új verziók alapállapotban már mind kikapcsolt register_globals változóval érkeznek. De itt sem kell aggódni, a már létező telepítések, amelyekben a php.ini fájlban be van kapcsolva a register_globals, megtartják ezt az értéket. Csak a teljesen új telepítéseket (ami tipikusan teljesen új felhasználókat jelent) érinti ezt - és persze akkor is bekapcsolható az érték, ha a felhasználó úgy akarja.
Megjegyzés: ezen tömbök közül egyeseknek korábban is volt neve, mint pl. a HTTP_GET_VARS.
Ezek a nevek még mindig működnek, de arra bátorítjuk a felhasználókat, hogy inkább az új, rövidebb, auto-globális változókat használják.
Köszönet Shaun Clowes-nak (shaun##kukac##securereality.com.au) a probléma analizálásáért és felmutatásáért.