Eval() is gevaarlijk

Door - SanThe - , 17 jaar geleden, 10.259x bekeken

Berekeningen met eval() zijn niet altijd veilig

Gesponsorde koppelingen

Inhoudsopgave

  1. Voorbeeld van een veiligheidslek

 

Er zijn 22 reacties op 'Eval is gevaarlijk'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Nibulez
Nibulez
17 jaar geleden
 
0 +1 -0 -1
Natuurlijk is eval(); gevaarlijk, je voert dan regelrecht een php code uit, je kan zorgen dat dit veilig gebeurt maar als iemand hier toch een lek in vind dan ben je screwed.
GaMer B
GaMer B
17 jaar geleden
 
0 +1 -0 -1
Sticky deze tutorial... Eval behoor je eigelijk voor zulke zaken nooit te gebruiken...
Bo az
Bo az
17 jaar geleden
 
Belangrijk punt, zeker voor beginners. Toch is eval hier niet het probleem maar user input validatie imho.
Joren de Wit
Joren de Wit
17 jaar geleden
 
Ik ben het helemaal met Boaz eens dat eval() hier niet het probleem is. Eval() is net zo gevaarlijk als de beperktheid van de kennis van de gebruiker ervan en daarom is deze korte tutorial goed!

Mensen die roepen dat eval() een slechte functie is die je nooit moet gebruiken, moeten zich misschien toe eens afvragen of die mening wel gegrond is. Als je weet wat je doet kan het zijn dat eval() op een gegeven moment een oplossing biedt (alhoewel ik het zelf nog nooit gebruikt heb). Het advies is dan ook niet 'niet gebruiken' maar 'pas op met het gebruik'...
- SanThe -
- SanThe -
17 jaar geleden
 
0 +1 -0 -1
@Blanche: Het advies is dan ook niet 'niet gebruiken' maar 'pas op met het gebruik'...

Dat is ook mijn mening. Maar zoals je zelf waarschijnlijk ook regelmatig hebt gezien wordt vaak de input klakkeloos in de eval() gezet. En dat gaat gewoon op een keer fout. Vandaar dit stukje schrijven.
Onbekend Onbekend
Onbekend Onbekend
17 jaar geleden
 
0 +1 -0 -1
Eval zelf is totaal ongevaarlijk. Maar als je het icm met user input gebruikt is het wel gevaarlijk, maar dat is sql zonder validatie ook als er user input wordt gebruikt.
Je moet iig zorgen dat je eval zo min mogelijk gebruikt om deze reden en omdat het redelijk traag is. Probeer altijd een omweg te zoeken door op één of andere manier met een functie te werken die aangeroepen wordt.
Joren de Wit
Joren de Wit
17 jaar geleden
 
0 +1 -0 -1
@SanThe: dat bedoel ik ook met mijn post. Ik ben blij dat je het opgeschreven hebt, dit is zeker handig voor beginners! :)
Aaa Trump
aaa Trump
17 jaar geleden
 
Eval is niet gevaarlijk, je moet gewoon je get/post data filteren?
Nibulez
Nibulez
17 jaar geleden
 
@Niborx:
En als een gebruikers of hacker toch een manier vind zodat die filtering geen nut heeft?
Steen
steen
17 jaar geleden
 
Gewoon geen eval gebruiken zou ik zeggen, is nergens écht voor nodig.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
unlink();
// als je maar rechten genoeg hebt...
?>
Nibulez
Nibulez
17 jaar geleden
 
Wat trouwens ook kan gebeuren en waar je bijna niks tegen kunt doen is dat de gebruiker functies uit kan voeren, chmodden, bestanden verwijderen etc.
Joren de Wit
Joren de Wit
17 jaar geleden
 
Nibulez:
Wat trouwens ook kan gebeuren en waar je bijna niks tegen kunt doen is dat de gebruiker functies uit kan voeren, chmodden, bestanden verwijderen etc.
Dit is wederom een kwestie van het controleren van user input en heeft dus meer daar mee te maken dan met de functionaliteit van eval() zelf.

Het is dus ook onzin dat je daar 'bijna niets tegen kunt doen'. Het kan juist heel eenvoudig: controleer alle user input goed.
Steen
steen
17 jaar geleden
 
Geef één voorbeeld waarbij het noodzakelijk is om eval te gebruiken? Volgens mij zijn er altijd andere oplossingen.


17 jaar geleden
 
Quote:
steen schreef op 02.01.2010 12:34
Geef één voorbeeld waarbij het noodzakelijk is om eval te gebruiken? Volgens mij zijn er altijd andere oplossingen.

Inderdaad, volgens mij zijn het voornamelijk situatie's waar de scripter te 'lui' is om 'ingewikkelde' oplossingen te maken.
Ik gebruik eval alleen voor een testscriptje, zodat ik niet een nieuwe pagina aan hoef te maken.
Joren de Wit
Joren de Wit
17 jaar geleden
 
0 +1 -0 -1
Quote:
Geef één voorbeeld waarbij het noodzakelijk is om eval te gebruiken? Volgens mij zijn er altijd andere oplossingen.
Zoals ik eerder al zei: ik ben zelf nog nooit zo'n situatie tegengekomen en vraag me ook af of ik het ooit nodig zal hebben.

Maar dan nog, men roept al heel snel dat bepaalde functies niet gebruikt moeten worden zonder daar enige correcte argumentatie voor te geven. Dat is waar ik over val, niet het gebruik van eval().
Nibulez
Nibulez
17 jaar geleden
 
Quote:
Dit is wederom een kwestie van het controleren van user input en heeft dus meer daar mee te maken dan met de functionaliteit van eval() zelf.

Het is dus ook onzin dat je daar 'bijna niets tegen kunt doen'. Het kan juist heel eenvoudig: controleer alle user input goed.


Hoe wil je user input controleren op functies, je kan niet elke functie weg gaan filteren, daarnaast kun je zelf ook nog functies maken.
SilverWolf NL
SilverWolf NL
17 jaar geleden
 
@Nibulez
Nee, dit kan inderdaad niet, maar je kan wel controleren voor alles wat wel mag. Bijvoorbeeld bij berekeningen, kan je filteren op alle functies die men wel mag gebruiken (denk aan abs(), sqrt(), pow(), sin(), cos() en tan()). Als er dan iets anders in zit, kan je een error teruggeven. Dat is veel sneller dan alles wat men niet mag gebruiken controleren. Verder zou je bij berekeningen intval() kunnen gebruiken, als het om numerieke functies gaat. Dan kan iemand nooit iets met een functie beginnen.
John Doe
John Doe
17 jaar geleden
 
Het gaat hier toch niet perse om eval() user input moet je altijd controleren op escapen.
Igor PortalPressDOTorg
Igor PortalPressDOTorg
16 jaar geleden
 
0 +1 -0 -1
Toch nog even reageren op een oude topic. Het is al vaker gezegd: Eval() is net zo gevaarlijk als de programmeur het maakt; met andere woorden: Als je welke functie dan ook verkeerd inzet, is nagenoeg elke functie gevaarlijk. Zelfs echo!
Ik gebruik eval() soms, omdat ik bepaalde scripts moet uitvoeren, die ikzelf heb geschreven. Ga je lukraak eval() gebruiken, zeker op gebruikers-input, dan loop je een zeker risico. Het is echter al aangegeven (SilverWolf NL), dat ook dat best mogelijk is, zolang je maar de boel zuivert van functies, die je niet wilt laten uitvoeren via eval(). Er zijn zat functies voor handen, om de boel te zuiveren. Slechts slechte programmeurs zijn bang voor eval() en moeten dit ook zijn.
Joris van Rijn
Joris van Rijn
16 jaar geleden
 
0 +1 -0 -1
Hiervoor heb je het nodig:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$arr
= array(2,
                 array('v', 'q', 5,
                                    array(5, 8, 'g'),
                                                      'x'));
$i=3;
$key1 = '[1]';
$key2 = '['.$i.']'; // E.g., could build this conditionally within a loop
$key3 = '[2]';

$keys = $key1.$key2.$key3; // Can add as many keys as needed (could be done instead via a loop with repeated calls to .= )

print $arr{$keys}; // This does not work
print $arr[$keys]; // This also does not work

// However...

eval('\$value = \$arr{$keys};');
print $value; // Correctly prints 'g'
?>


(bron php.net)
Igor PortalPressDOTorg
Igor PortalPressDOTorg
16 jaar geleden
 
0 +1 -0 -1
Ja, bijvoorbeeld @Joris van Rijn. Zo maak ik soms een string 'array(iets,nog iets,array(veel meer zelfs, en nog wat))' van bepaalde [multi-]array's.
Met eval('return(' . string . ');'); krijg ik netjes mijn [multi-]array terug. Posten als van Steen, die zeggen, dat het nergens voor nodig is? Ja, als je plat en niet dynamisch programmeert, is het inderdaad niet nodig. Zegt meer over de poster, dan over de functie eval().
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jelmer -
Jelmer -
16 jaar geleden
 
0 +1 -0 -1
Impliceer je daarmee dat je eval nodig hebt voor dynamisch programmeren? Volgens mij zijn er zat mooie oplossingen te verzinnen die werken met objecten en call_user_func, manieren die ook in andere programmeertalen werken en worden erkent als programmeerparadigmas.

Strings aan elkaar plakken er vervolgens hopen dat het geldige PHP code is en hopen dat het ook nog eens slechts dat doet wat jij denkt dat hij doet is niet dynamisch programmeren. Dat is gewoon slecht programmeren. En dat is de enige situatie waarin je eval() nodig hebt.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Voorbeeld van een veiligheidslek

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.