ugrás a tartalomhoz

Az eval() használatának veszélyei

Hojtsy Gábor · 2005. Aug. 3. (Sze), 11.49
A nemrégiben napvilágra került PHP XML-RPC hibák arra voltak visszavezethetőek, hogy a különböző kódkönyvtárakban használt XML-RPC értelmező kódok nem túl okosan használták az eval() függvényt működésük során, és ez széles biztonsági kapukat tárt a szkriptekben. Az eval() nagyon csábító, számos lehetőséget ad a fejlesztők számára, elsősorban dinamikus szerkezetű programok kialakítására. Joshua Eichorn blogjában próbált meg rávilágítani a biztonsági és teljesítmény kockázatokra, melyeket érdemes meggondolnunk.

Using Eval in PHP című blog bejegyzésében rámutat arra, hogy három fő felhasználási módja terjedt el az eval()-nak.
  • Egyrészt lehetőséget ad arra, hogy kompatibilitást biztosító elemként használjuk, azaz például karaktersorozatban adjuk meg a PHP 5 kulcsszavakat is használó kódot, melyet csak a megfelelően aktuális PHP verzió használata esetén hajtunk végre, elkerülve a régebbi PHP-k által generált feldolgozási hibát. Ha nincs ilyen kulcsszó problémánk, akkor egy egyszerű feltételesen definiált kódszakasz is megoldást ad, így könnyen elkerülhetjük az eval()-t.
  • Futásidőben tudunk különböző osztályokat és függvényeket definiálni, például egy SOAP-on keresztül távol definiált eljárás beburkolására. Itt nagyon körültekintőeknek kell lennünk az elnevezések ellenőrzésekor, hiszen a metódus nevek dinamikusan adódnak.
  • Végül változó érték alapján történő függvényhívásra is használatos az eval(), ám ezt teljesen elkerülhetjük, hiszen a PHP beépített függvényekkel rendelkezik ennek támogatására.

Tehát összességében nagyon trükkös dolgokat tesz lehetővé az eval(), ám célszerű kerülni a használatát legalábbis biztonsági okok miatt. Azok számára, akiknek a sebesség is fontos, Joshua ennek ellenőrzésére szolgáló teszteket is bemutat, melyek világosan láthatóvá teszik, hogy az eval() ráadásul igen lassú is.
 
1

csiga

Hodicska Gergely · 2005. Aug. 3. (Sze), 12.37
Azért ne az a kép alakuljon ki mindenkiben, hogy az eval valami hihetetlenül lassú dolog. Annyira lassú, mint egy include.


Felhő
2

Soha

Anonymous · 2005. Aug. 4. (Cs), 12.49
Hát én ezt életemben nem használtam... Erröl egyébként néhány javascriptes cucc jut eszembe, ahol minden eval-ba van csomagolva.
3

Dinamikus modul-betöltés

Anonymous · 2005. Aug. 9. (K), 12.22
Gondolj arra, hogy vannak moduljaid egy könyvtárban és nem tudod hányan vannak. Namost, az egészet spékeljük meg azzal, hogy a modulok class-okba vannak becsomagolva. Mit csinálsz? Minden fájlra ráengeded ezt: ($fbasename a fájl neve kiterjesztés nélkül)

eval("\$modules[\$fbasename] = new " . $fbasename . "();");


És kész a modulbetöltö. Ha megcsinálod hozzá a depencency-vizsgálatokat is, akkor pillanatok alatt készen vannak nagyobb rendszerek anélkül, hogy foglalkoznod kellene azzal, hogy hány és milyen modulokat pakolsz bele. Csak szép sorjában írogasd meg öket.

ProClub
proclub##kukac##karinthy.hu
4

minek eval?

bbalint · 2005. Aug. 9. (K), 14.52
nem kell eval(), lehet változót is megadni, hogy milyen osztályot akarol:

<script language="PHP">
 $stdclass = 'stdClass';
 
 print_r(new $stdclass());
</script>
e fenti kód létrehoz egy ilyen beépített osztályt, az stdClass-ot jól.

bbalint
5

Tipikus rossz példa

Hodicska Gergely · 2005. Aug. 10. (Sze), 09.35
Szia!


Tipikusan rossz használata az eval-nak, mint ahogy bbalint már rá is világított. Plussz még csak annyit, hogy az ilyen kód mellett még az is tipikus, hogy az fbasename URL-ből jön, nincs rendesen ellenőrzive, és máris ott figyelsz egy security értesítőben.


Felhő