ugrás a tartalomhoz

A PHP 4.1.0 új adatbeviteli felülete

Granc Róbert · 2001. Dec. 11. (K), 12.30
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.