Versio

Eval() is gevaarlijk

Berekeningen met eval() zijn niet altijd veilig

Gesponsorde koppelingen

BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  

Inhoudsopgave

  1. Voorbeeld van een veiligheidslek

 

22 reacties op 'Eval() is gevaarlijk'

PHP hulp
PHP hulp
0 seconden vanaf nu
 
Gesponsorde koppelingen
Nibulez
Nibulez
3 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
3 jaar geleden
 
0 +1 -0 -1
Sticky deze tutorial... Eval behoor je eigelijk voor zulke zaken nooit te gebruiken...
Bo az
Bo az
3 jaar geleden
 
1 +1 -0 -1
Belangrijk punt, zeker voor beginners. Toch is eval hier niet het probleem maar user input validatie imho.
Joren de Wit
Joren de Wit
3 jaar geleden
 
2 +1 -0 -1
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 -
3 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.
Luuk Schakenraad
Luuk Schakenraad
3 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
3 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! :)
Niborx Trump
Niborx Trump
3 jaar geleden
 
1 +1 -0 -1
Eval is niet gevaarlijk, je moet gewoon je get/post data filteren?
Nibulez
Nibulez
3 jaar geleden
 
0 +1 -1 -1
@Niborx:
En als een gebruikers of hacker toch een manier vind zodat die filtering geen nut heeft?
Steen
steen
3 jaar geleden
 
0 +1 -1 -1
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
3 jaar geleden
 
0 +1 -1 -1
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.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Joren de Wit
Joren de Wit
3 jaar geleden
 
1 +1 -0 -1
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
3 jaar geleden
 
0 +1 -1 -1
Geef één voorbeeld waarbij het noodzakelijk is om eval te gebruiken? Volgens mij zijn er altijd andere oplossingen.
Karl Karl
Karl Karl
3 jaar geleden
 
0 +1 -1 -1
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
3 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
3 jaar geleden
 
0 +1 -1 -1
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
3 jaar geleden
 
1 +1 -0 -1
@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.
Daniel Voogsgerd
Daniel Voogsgerd
3 jaar geleden
 
2 +1 -0 -1
Het gaat hier toch niet perse om eval() user input moet je altijd controleren op escapen.
 
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
1 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)
 
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().
Jelmer rrrr
Jelmer rrrr
1 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.

  • Labels
  • Geen tags toegevoegd.
Get Adobe Flash player