Eval() is gevaarlijk
Berekeningen met eval() zijn niet altijd veilig
Gesponsorde koppelingen
Inhoudsopgave
22 reacties op 'Eval() is gevaarlijk'
Gesponsorde koppelingen
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'...
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'...
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.
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.
Nibulez:
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.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.
Het is dus ook onzin dat je daar 'bijna niets tegen kunt doen'. Het kan juist heel eenvoudig: controleer alle user input goed.
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.
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.
Quote:
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.Geef één voorbeeld waarbij het noodzakelijk is om eval te gebruiken? Volgens mij zijn er altijd andere oplossingen.
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().
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.
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.
@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.
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.
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.
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.
Hiervoor heb je het nodig:
(bron php.net)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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'
?>
$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)
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().
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().
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.
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.
- Details
Door:
- SanThe -- 3 jaar geleden
- 3.843 x bekeken
- Labels
- Geen tags toegevoegd.
- PHP tutorials opties
- Berekeningen
- Nieuwste PHP tutorials
- PHP tutorial toevoegen


PHP hulp
0 seconden vanaf nu