eval() parsed niets bij newline?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik de functie eval voor het parsen van php uit een database. deze php wordt aangeleverd door html heen en ik gebruik een custom functie om dit allemaal te doen:

de functie pakt een string, echoed de html draait de php en geeft de gevonden php terug. hij ziet er zo uit....

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
//func_evalecho.php

function evalecho($aPHP){
    // Search for PHP
    $aNormalSTR=preg_split('/<\?php(.*?)\?>/i', $aPHP, -1, PREG_SPLIT_OFFSET_CAPTURE);

    for($i = 0; $i < count($aNormalSTR); $i++){
        echo $aNormalSTR[$i][0];

        if(count($aNormalSTR) > 1){
            $aFirstPHPPointer  = ((int) $aNormalSTR[$i][1] + (int) strlen($aNormalSTR[$i][0]));
            $aSecondPHPPointer = ($aNormalSTR[($i+1)][1] - ($aNormalSTR[$i][1] + strlen($aNormalSTR[$i][0])));

            $a2EXE=substr($aPHP, $aFirstPHPPointer, $aSecondPHPPointer);
            $a2EXE=str_replace('<?php','',$a2EXE);
            $a2EXE=str_replace('?>','',$a2EXE);
            eval($a2EXE);

            $php_matches[]=$a2EXE;
        }
    }

    return $php_matches;
}
?>


nu is deze code in samenwerking met een tweede persoon tot stand gekomen omdat ik weinig kaas van preg_matching heb gegeten. ik loop nu alleen tegen een probleem aan.

Als er als input een lap html+php wordt gegeven voert hij deze vlekkeloos uit, voorbeeld:
code:
1
2
<?php echo"hoi"; echo "hoi";?>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce porta. Fusce viverra tempor tortor. In libero erat, rhoncus


maar als een newline in de php zit parsed hij dit niet, voorveeld:
code:
1
2
3
<?php 
echo"hoi";
?>

Afbeeldingslocatie: http://www.easy-upload.nl/index.php/file/2049fb085e98480.png
Hoe komt dit, en hoe kan ik dit oplossen?

[ Voor 8% gewijzigd door Verwijderd op 01-05-2009 16:33 ]


Acties:
  • 0 Henk 'm!

  • XiniX88
  • Registratie: December 2006
  • Laatst online: 17-09 19:30
preg_split doet zijn werk maar op 1 regel. /im moet het dus worden (case insensitive, multiline) of /is, de . geldt dan over meerdere regels (doe die laatste maar is testen (/is dus)).

http://fliiby.com/file/192472/npo568d8lh.html

en lees de regex regels nog eens door... dit is vrij basic

[ Voor 89% gewijzigd door XiniX88 op 01-05-2009 16:40 . Reden: Drukte te vroeg op enter ]


Acties:
  • 0 Henk 'm!

Verwijderd

PHP in een database stoppen is sowieso al zo'n dramatisch slecht plan, dat ik denk dat het beter is om dáár iets beters op te verzinnen dan om een pleister te zoeken.

Het daadwerkelijke probleem is een gebrek aan kennis en ervaring op het gebied van design patterns.

Acties:
  • 0 Henk 'm!

  • XiniX88
  • Registratie: December 2006
  • Laatst online: 17-09 19:30
Verwijderd schreef op vrijdag 01 mei 2009 @ 16:40:
PHP in een database stoppen is sowieso al zo'n dramatisch slecht plan, dat ik denk dat het beter is om dáár iets beters op te verzinnen dan om een pleister te zoeken.

Het daadwerkelijke probleem is een gebrek aan kennis en ervaring op het gebied van design patterns.
Niet helemaal mee eens, neem vBulletin, die zet het design inclusief code ook in de database. Zolang het een afgeschermde tabel betreft is daar niets mis mee (of je files nu stored in je database of in een directory (okey PHP cache gaat niet werken, dus het is trager maar toch)), maar dan moet het wel echt om een templating system gaan.

Overigens om je verhaal niet geheel af te kraken, gelijk heb je in 9 van de 10 gevallen, eval is een functie die zo min mogelijk gebruikt dient te worden, echter zijn er wel uitzonderingen.

Maar zover ik weet (ik gebruik eval echter bijna nooit) kan je het volgende ook gewoon evallen:

code:
1
Dit is een tekst en 1 + 1 = <?=(1+1)?>
en heb je er dus geen functie voor nodig.

[ Voor 16% gewijzigd door XiniX88 op 01-05-2009 16:54 ]


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

XiniX88 schreef op vrijdag 01 mei 2009 @ 16:43:
[...]

Niet helemaal mee eens, neem vBulletin, die zet het design inclusief code ook in de database. Zolang het een afgeschermde tabel betreft is daar niets mis mee (of je files nu stored in je database of in een directory (okey PHP cache gaat niet werken, dus het is trager maar toch)), maar dan moet het wel echt om een templating system gaan.

Overigens om je verhaal niet geheel af te kraken, gelijk heb je in 9 van de 10 gevallen, eval is een functie die zo min mogelijk gebruikt dient te worden, echter zijn er wel uitzonderingen.

Maar zover ik weet (ik gebruik eval echter bijna nooit) kan je het volgende ook gewoon evallen:

code:
1
Dit is een tekst en 1 + 1 = <?=(1+1)?>
en heb je er dus geen functie voor nodig.
Dit geeft een parse error
PHP:
1
2
3
4
<?php

eval("Dit is een tekst en 1 + 1 = <?=(1+1)?>");
?>


Verder dat vBullitin het gebruikt maakt het nog niet goed ( of slecht ). Maar over het algemeen gesproken is het gebruik van eval "not done". Het is niet verboden!

eval hoort in het rijtje thuis bij de "goto". ;)

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
LuCarD schreef op vrijdag 01 mei 2009 @ 16:58:
[...]


Dit geeft een parse error
PHP:
1
2
3
4
<?php

eval("Dit is een tekst en 1 + 1 = <?=(1+1)?>");
?>


Verder dat vBullitin het gebruikt maakt het nog niet goed ( of slecht ). Maar over het algemeen gesproken is het gebruik van eval "not done". Het is niet verboden!

eval hoort in het rijtje thuis bij de "goto". ;)
Dat geeft een error ja.

PHP:
1
2
3
<?php
eval('?>Dit is een tekst en 1+1 = <?php echo (1+1); ?>. :)<?php');
?>

Dit niet.

Of moest ik in die string nou '?' . '>...' doen? Weet ik even niet zeker meer.

[ Voor 6% gewijzigd door Tanuki op 01-05-2009 17:06 ]

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • XiniX88
  • Registratie: December 2006
  • Laatst online: 17-09 19:30
LuCarD schreef op vrijdag 01 mei 2009 @ 16:58:
[...]
Verder dat vBullitin het gebruikt maakt het nog niet goed ( of slecht ). Maar over het algemeen gesproken is het gebruik van eval "not done". Het is niet verboden!

eval hoort in het rijtje thuis bij de "goto". ;)
Dat probeerde ik inderdaad te zeggen, er zijn situaties waarbij men het wel wil gebruiken, het is een functie, niet verboden en ik zou het daarom geen "pleister plakken" noemen, maar dit terzeide.

Verder wat localhost idd zegt gaat het met ?> wel, ik geloof dat de <?php niet eens nodig is. Als ik de PHP documentatie lees staat daar:
[...]The code string to be evaluated. code_str does not have to contain PHP Opening tags.[...]
Kortom PHP gaat er bij eval gelijk vanuit dat het PHP code betreft, met ?> escape je daar dus aan.

code:
1
2
$stringToEval = "Wist u dat 1 + 1, <?=(1+1)?> is?";
eval("?>".$stringToEval);


zou dus voldoende moeten zijn. (getest en werkt)

[ Voor 5% gewijzigd door XiniX88 op 01-05-2009 17:13 . Reden: Stelling getest ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
XiniX88 schreef op vrijdag 01 mei 2009 @ 16:35:
preg_split doet zijn werk maar op 1 regel. /im moet het dus worden (case insensitive, multiline) of /is, de . geldt dan over meerdere regels (doe die laatste maar is testen (/is dus)).

http://fliiby.com/file/192472/npo568d8lh.html

en lees de regex regels nog eens door... dit is vrij basic
thx, dat was em, zoals ik al zei, van preg_matching heb ik weinig kaas gegeten. de tweeede persoon wist dit ook niet. In ieder geval bedankt ;)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

XiniX88 schreef op vrijdag 01 mei 2009 @ 17:12:
Dat probeerde ik inderdaad te zeggen, er zijn situaties waarbij men het wel wil gebruiken, het is een functie, niet verboden en ik zou het daarom geen "pleister plakken" noemen, maar dit terzeide.
Pertinent niet eens. In 99.9% van de gevallen dat eval gebruikt wordt is het pleisterwerk. Vaak omdat de programmeur niet competent genoeg is om een fatsoenlijke oplossing te vinden. Zou je eval gebruiken dan zul je een behoorlijk goede argumentatie op moeten kunnen zetten over het waarom.

Dat vBullitin eval gebruikt zegt misschien wel meer over vBullitin dan over eval. Er zijn maar een heel beperkt aantal usecases waarbij eval te verdedigen valt. Je kunt er dus niet zomaar vauit gaan dat eval ok is omdat vBullitin het gebruikt, zeker wanneer je de verdediging van het gebruik compleet achterwege laat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De omgeving waarin het gebruikt wordt is alvolgt. Het cms wat ik aan het bouwen bent gaat er vanuit dat elke functie zowel door het cms als door de gebruiker aangeroepen kan worden door een API, deze API bestaat uit een serie php bestanden die ofwel een functie leveren of wel 'iets doen' ofwel een handeling verrichten en dan de pagina doorsturen.

Deze opzet zorgt ervoor dat bijna alle website designs mogelijk zijn en dat wil ik graag zo houden, ook in situaties waarin dynamische inhoud wordt gegenereerd.

Daarom wil ik dat in de editor php kan worden gebruikt zodat
A ) de gebruiker zelf dynamische omgevingen kan maken.
B ) de gebruiker van de API gebruik kan maken.

het is dan onhandig om dan met vage bestanden te gaan werken die geinclude worden. Daarom heb ik voor eval() (en ja daar is over nagedacht

Dankzij XiniX88 is het probleem trouwens opgelost, het werkt nu als een zonnetje, waarvoor dank.

[ Voor 5% gewijzigd door Verwijderd op 02-05-2009 00:00 ]


Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Verwijderd schreef op vrijdag 01 mei 2009 @ 23:58:

het is dan onhandig om dan met vage bestanden te gaan werken die geinclude worden. Daarom heb ik voor eval() (en ja daar is over nagedacht
Dus nu krijg je allemaal vage code in je database :? Dingen zoals
PHP:
1
2
3
4
5
6
7
8
9
$dir = "/var/www/";
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            unlink($dir.$file);
        }
        closedir($dh);
    }
}

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Leuk verhaal over wat je gedaan hebt, maar ik zie weinig aanknopings punten waarom je het zo gedaan hebt. Nergens zie ik een daadwerkelijke omschrijving van het probleem dat je oplost. Wat zijn de voordelen van de huidige aanpak, wat waren de nadelen van de andere aanpakken wogen de nadelen van de huidige aanpak op tegen de voordelen van andere mogelijkheden. Daarbij gaat het dan niet alleen of het werkt, maar ook over de stabiliteit, veiligheid, onderhoudbaarheid, enz enz.

En iets uit het zicht verstoppen in de database zodat je geen 'vage bestanden' hebt is niet een erg sterk argument.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Janoz schreef op vrijdag 01 mei 2009 @ 19:21:
[...]
Dat vBullitin eval gebruikt zegt misschien wel meer over vBullitin dan over eval. Er zijn maar een heel beperkt aantal usecases waarbij eval te verdedigen valt. Je kunt er dus niet zomaar vauit gaan dat eval ok is omdat vBullitin het gebruikt, zeker wanneer je de verdediging van het gebruik compleet achterwege laat.
In al die jaren dat ik al met php werk heb ik nog nooit eval moeten gebruiken. Ik kan mij ook niet goed inbeelden waarom ik het nodig zou hebben, maar ben wel nieuwsgierig. Heb je een aantal voorbeelden van situaties waarin je eval kan "rechtvaardigen" ?

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op zaterdag 02 mei 2009 @ 08:32:
[...]


Leuk verhaal over wat je gedaan hebt, maar ik zie weinig aanknopings punten waarom je het zo gedaan hebt. Nergens zie ik een daadwerkelijke omschrijving van het probleem dat je oplost. Wat zijn de voordelen van de huidige aanpak, wat waren de nadelen van de andere aanpakken wogen de nadelen van de huidige aanpak op tegen de voordelen van andere mogelijkheden. Daarbij gaat het dan niet alleen of het werkt, maar ook over de stabiliteit, veiligheid, onderhoudbaarheid, enz enz.

En iets uit het zicht verstoppen in de database zodat je geen 'vage bestanden' hebt is niet een erg sterk argument.
het gaat erom dat de gebruiker (wie het systeem ook gaat onderhouden) makkelijk php kan gebruiken i.c.m. met de huidige html die al gemaakt wordt door de editor (of eventueel zelf), als de helft van de data dan uit de database moet komen en de andere helft uit een paar vage bestandjes is dat gewoon zeer onhandig.

let wel dat de toegang tot dit soort items beperkt is en achter een wachtwoord zit. en dat de gebruiker van het systeem expliciete een functie moet aanroepen (evalecho) inplaats van een standaard echo. als de gebruiker dit niet wil gaan gebruiken kan de hele functie gewoon worden weggelaten.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

@Hacku:

Ik heb lang nagedacht, maar ik heb niet 1 voorbeeld kunnen vinden waarvoor niet een nettere oplossing was :).

@Tuxedo-Devito

Leuk dat je je gebruikers die vrijheid wilt geven, maar heb je bijvoorbeeld wel eens gedacht aan het feit dat die mensen hun php code wel eens niet helemaal goed (over)getikt kunnen hebben? Heb je wel eens gezien wat voor zeer 'verhelderende' foutmeldingen je daarop krijgt? En dan begin ik nog niet over de onmogelijkheid van het goed kunnen testen van dergelijke dynamische code.

Verder impliceer je met een verschillende functieaanroep dat de gebruikers blijkbaar zelf ook al een stuk in de gewone php code aan kunnen passen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op zondag 03 mei 2009 @ 14:53:

Ik heb lang nagedacht, maar ik heb niet 1 voorbeeld kunnen vinden waarvoor niet een nettere oplossing was :).
Heel misschien een situatie waarin je dynamisch gegenereerde algoritmes wilt gebruiken?

Ook dan is het niet noodzakelijk, maar wel een hoop minder werk dan zelf een parser schrijven.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dan nog zou mijn voorkeur uitgaan naar een soort callback functie. Dat werkt natuurlijk niet wanneer de code echt from scratch dynamisch at runtime gegenereerd wordt, maar vaak heb je dan te maken met een heel afgebakend klein stuk functionaliteit. Het lijkt me dan niet eens zo heel veel werk meer om zelf het resultaat te interpreteren. Eval gebruiken zou immers betekenen dat je je resultaat eerst zal moeten transformeren naar een string code en dan door eval gooien. Aangezien je het gewenste waarschijnlijk al in een syntaxtree hebt zitten, is het interpreteren nauwelijks ingewikkelder dan de andere mogelijkheid.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Afgezien van het gebruik van een database om je code in te bewaren doe je nog iets fout en ik vraag me af of dat met regexes wel zo makkelijk op te lossen is (lees: mogelijk / de bedoeling is).

PHP:
1
2
/*...*/ ?><?php echo "Kijk, een sluittag in een string: ?> Leuk, he?\n"; ?><?php
evalecho('<?php echo "Kijk, een sluittag in een string: ?> Leuk, he?\n"; ?>');
Kijk, een sluittag in een string: ?> Leuk, he?

Parse error: syntax error, unexpected $end in /home/dataghost/-(16) : eval()'d code on line 1
Leuk, he?\n"; ?>

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Volgens mij kun je die hele functie ook beter weggooien.. ;)
PHP:
1
eval('?>'.'<?php echo "Kijk, een sluittag in een string: ?> Leuk, he?\n"; ?>');

En dan daarna eens [google=eval evil]. :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

pedorus schreef op maandag 04 mei 2009 @ 15:55:
En dan daarna eens [google=eval evil]. :)
Dat levert alleen een hoop resultaten op van mensen die elkaar napapegaaien. Er zijn vast usecases te verzinnen waar eval zinnig toepasbaar is (al kan ik er zo geen verzinnen), en de functie zelf is ook niet evil. Je moet weten waar en wanneer hij toepasbaar is en hem alleen gebruiken als er écht geen betere oplossing is.

Los daarvan zou ik het in de situatie van de topicstarter niet willen gebruiken. Files horen op je filesystem, niet in je database, ook als het semi-dynamische templates zijn. Een stukje uploadcode is natuurlijk erg triviaal en zo geschreven. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

NMe schreef op maandag 04 mei 2009 @ 16:20:
Dat levert alleen een hoop resultaten op van mensen die elkaar napapegaaien. Er zijn vast usecases te verzinnen waar eval zinnig toepasbaar is (al kan ik er zo geen verzinnen), en de functie zelf is ook niet evil. Je moet weten waar en wanneer hij toepasbaar is en hem alleen gebruiken als er écht geen betere oplossing is.
Niet mee eens. Het lijkt me het beste om per definitie uit te gaan van het statement 'eval == evil'. Zoals je zelf al aangeeft kun jij ook geen passende usecase verzinnen. Ik durf te stellen dat er bijna altijd een betere oplossing is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Janoz schreef op maandag 04 mei 2009 @ 16:59:
[...]

Niet mee eens. Het lijkt me het beste om per definitie uit te gaan van het statement 'eval == evil'. Zoals je zelf al aangeeft kun jij ook geen passende usecase verzinnen. Ik durf te stellen dat er bijna altijd een betere oplossing is.
Bijna altijd, inderdaad. ;) Liever dan dat ik mensen aanpraat dat "eval == evil" heb ik dat mensen zelf heel goed nadenken over of dat in hun geval écht zo is of niet. 99 van de 100 keer gebruik je eval niet in een oplossing waarin het een optie zou zijn, maar die honderdste keer zou het best eens kunnen dat het de minst slechte oplossing is. Als je dan vast zit aan het stigma dat eval slecht is en niet gebruikt mag worden, dan zit je mooi vast. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
NMe schreef op maandag 04 mei 2009 @ 17:11:
Als je dan vast zit aan het stigma dat eval slecht is en niet gebruikt mag worden, dan zit je mooi vast. :)
Nee, het bespaart je in 99 vd 100 gevallen gewoon het nadenken over een optie. En zeker voor de mensen welke nog niet alle opties kunnen bedenken, scheelt het naleven van die vuistregel een hoop slechte (*&^%$@^code.

Imo dus wel eval==evil prediken, en de persoon die een weloverwogen beslissing kan nemen dat eval nodig is kan dan simpelweg - maar wel goed onderbouwd - met die vuistregel breken.

{signature}


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Waarom gebruikt TS nog steeds die preg_match() dan? Die is niet nodig, zoals hierboven werd geroepen.

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 15-09 16:33
sja, als het toch niet om snelheid gaat, kan je ook gewoon de inhoud van de template naar een file schrijven en die includen. Dan houd je in de db een verwijzing naar de file bij.

Als compromis kan je @runtime de code naar een tempfile schrijven en die includen. Dan ben je van de gare regexp en de eval call af. (niet dat dit een mooie oplossing is natuurlijk).

ik ben het iig met de andere mensen eens; eval == evil. De paar keren dat ik het gebruikt heb was in situaties waar een lelijke hack nodig was, met te weinig tijd om een fatsoenlijk o ntwerp te maken. Maar in productie code is het echt gruwelijk wat mij betreft!

Volgens mij biedt bijvoorbeeld smarty ook de optie om templates te genereren vanuit de db. Daarbij wordt echter vanuit de db een template gegenereed, die van disk gecached wordt en dus ook geinclude. En dus is ook daar eval niet nodig. eval == evil! :P

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Voutloos schreef op maandag 04 mei 2009 @ 17:19:
[...]

Imo dus wel eval==evil prediken, en de persoon die een weloverwogen beslissing kan nemen dat eval nodig is kan dan simpelweg - maar wel goed onderbouwd - met die vuistregel breken.
Je wil niet weten hoeveel veelbelovende programmeurs ik al heb gesproken die blijven roepen dat eval evil is maar desgevraagd niet kunnen zeggen waarom. Dat heeft een beetje hetzelfde effect als maar alles in een div stoppen omdat tables vies zijn. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Wanneer een programmeur blijkbaar niet kan vertellen waarom eval evil is, kan hij ook niet vertellen wanneer eval niet evil is. Daarmee valt deze dus automatisch in de cateogrie die nog niet die beslissing kan nemen :).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • XiniX88
  • Registratie: December 2006
  • Laatst online: 17-09 19:30
Een include is ook niet veel meer (dus wel iets meer) dan een open en lees het bestand en evalueer de code... eval(file_get_contents("filename.php"));

Nogmaals tijdens een normale structuur zal je dit niet zo snel tegenkomen omdat je de normale code vaak schrijft in echte bestanden en niet in een database. Echter cache kan je wegschrijven in een database (is een keuze waar je dit laat).

template/mijn_pagina.php

deze parse je vervolgens naar normale PHP code, zodat je hem direct kan uitvoeren. Deze cache kan je vervolgens of in het mapje cache/ opslaan, maar zou ook in een database opgeslagen kunnen worden. Ik zou niet weten waarom niet.

Het enige wat ik probeer te zeggen is dat mensen er soms voor kunnen kiezen dingen in een database op te slaan, en probeer dus inderdaad het punt te maken dat de eval functie voor sommige soms wel handig is. Btw je filesystem is ook maar een database... Je kan hooguit wat zeggen over de performance van beide... database zal waarschijnlijk trager zijn.

Maar een mooier voorbeeld is de eval functie van javascript, die ineens wel massaal wordt gebruikt om de JSON direct in te laden. Hier zou een eval dus weer wel mogen? Omdat inladen via ajax wel normaal is, maar inladen vanaf een database not done is... Btw ik weet dat firefox in de nieuwe versie straks een veilige eval functie heeft...

JSON: The Fat-Free Alternative to XML... (sorry: ik haat XML)

Dat tabelloos design heeft iets te maken met de W3c regels: http://www.w3.org/2002/03/csslayout-howto iets met, je design maak je zonder tabel, een tabel gebruik je alleen om gegevens in te ordenen.

[ Voor 22% gewijzigd door XiniX88 op 04-05-2009 20:29 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
NMe schreef op maandag 04 mei 2009 @ 19:32:
[...]

Je wil niet weten hoeveel veelbelovende programmeurs ik al heb gesproken die blijven roepen dat eval evil is maar desgevraagd niet kunnen zeggen waarom. Dat heeft een beetje hetzelfde effect als maar alles in een div stoppen omdat tables vies zijn. ;)
Nou ja, mijn ervaring is toch dat oplossingen met eval vaak duiden op (beginnende) programmeurs die niet weten waar ze mee bezig zijn. :) Ik zou zeggen, kijk eens naar de volgende zaken:
  • Veiligheid
    Als je code in de database opslaat zoals hier, kan een sql-injectie opeens tot een remote code executie leiden. Voor je het weet loop je spam-mailtjes te versturen. Een ander voorbeeld is inderdaad native JSON
  • Complexiteit
    Er is opeens code op meerdere niveaus aanwezig, wat je normaal niet verwacht als programmeur. Hier valt dat trouwens nog wel mee. Hoewel, misschien speelt hier toch het Inner-platform effect. ;)
  • Performance
    PHP is gebouwd en geoptimaliseerd om de code op het filesystem te hebben. Als je databaserequests gaat doen met eval() kan dat wel eens tegenvallen qua performance, al is het maar omdat de code steeds opnieuw geparsed gaat worden.
Maar natuurlijk is eval niet altijd evil. Ik kan me bijvoorbeeld iets indenken van een soort online php-commandline voor webmasters. Veiligheid, complexiteit en performance zijn dan geen issue,

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Nu online
Ik las net iets over dynamische templates. Er zijn toch hele mooie systemen waar je gewoon met dynamische templates kan werken zonder dat je hoeft te evallen. Ik kan me echt serieus geen voorbeeld bedenken waar je eval BETER kan gebruiken dan een alternatief. Als die er wel zijn dan sta ik natuurlijk open om relevante voorbeelden te zien.

Maar ook echt relevante voorbeelden zie ik nooit in een eval - discussie.

Ik zou dus zeggen niet doen.
Maar natuurlijk is eval niet altijd evil. Ik kan me bijvoorbeeld iets indenken van een soort online php-commandline voor webmasters. Veiligheid, complexiteit en performance zijn dan geen issue,
Maar wat je jezelf af moet vragen; is er een beter alternatief?

[ Voor 23% gewijzigd door RedHat op 04-05-2009 23:11 ]


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Op zich kan ik het me voorstellen dat je php code in een db opslaat en daarmee een php bestand opbouwd. Stel dat het bestand nog opgebouwd moet worden. Is eval dan een fractie sneller dan wachten totdat het bestand weggeschreven is?

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • Kwastie
  • Registratie: April 2005
  • Laatst online: 19-09 10:42

Kwastie

Awesomeness

AlainS schreef op maandag 04 mei 2009 @ 23:27:
Op zich kan ik het me voorstellen dat je php code in een db opslaat en daarmee een php bestand opbouwd. Stel dat het bestand nog opgebouwd moet worden. Is eval dan een fractie sneller dan wachten totdat het bestand weggeschreven is?
Sla nooit, maar dan ook nooit code op in je database. :X

Het feit dat je zoiets zou willen doen geeft aan dat er iets goed fout is met het ontwerp van je applicatie 8)7
pedorus schreef op maandag 04 mei 2009 @ 22:28:

Maar natuurlijk is eval niet altijd evil. Ik kan me bijvoorbeeld iets indenken van een soort online php-commandline voor webmasters. Veiligheid, complexiteit en performance zijn dan geen issue,
Wil je wel eens een 'webbased' php 'commandline' gebruiken? Ik log veel liever in op mijn server via ssh en beheer zo mijn server. _/-\o_


@ hieronder:
Noem eens een voorbeeld wanneer je code zou willen opslaan in een database.. ?

[ Voor 47% gewijzigd door Kwastie op 05-05-2009 00:01 ]

When I get sad i stop being sad and be awesome instead


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Kwastie schreef op maandag 04 mei 2009 @ 23:43:
Sla nooit, maar dan ook nooit code op in je database. :X
Dit vind ik onzin. :)

Als je code genereert kan het best handig zijn om de basis code relationeel op te slaan. :)

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb wel eens een handig tooltje op basis van eval gezien.

Een soort van scratchpad waarin je direct kleine stukjes code kunt plaatsen en uitvoeren. Ideaal om bijvoorbeeld een regex te debuggen, even snel iets een ingewikkelde berekening te maken of wat te brainen.

Verder heb ik vooral veel workarounds gezien voor mensen die een statische functie van een class willen aanroepen waarbij de classname uit een variabele moet komen. Dat heeft ooit ergens in 1 voorbeeld op internet gestaan en sindsdien zie ik het heel vaak voorbij komen.

In PHP 5.3.0 en hoger is dat static aanroepen gefixed dat het werkt zoals je zou verwachten.

[ Voor 8% gewijzigd door Verwijderd op 05-05-2009 00:08 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

AlainS schreef op maandag 04 mei 2009 @ 23:27:
Op zich kan ik het me voorstellen dat je php code in een db opslaat en daarmee een php bestand opbouwd. Stel dat het bestand nog opgebouwd moet worden. Is eval dan een fractie sneller dan wachten totdat het bestand weggeschreven is?
Euhm, wanneer je runtime een bestand wegschrijft en dan include gebruik je misschien wel niet de functie eval, maar de techniek is niks anders en daarom ook niet minder fout. Eigenlijk is dit precies het punt dat NMe ook aanhaalt. Eval niet willen gebruiken, maar vervolgens een workaround verzinnen die dezelfde bezwaren heeft als eval. Vergelijk dat inderdaad eens met iemand die tables weigert te gebruiken en vervolgens ales in divjes stopt. Goed, tables worden niet meer voor layout gebruikt, maar het hele idee van semantische HTML (de reden om geen tabellen van layout te gebruiken) is volledig aan de ontwikklaar voorbij gegaan.

Ik kan mij bijvoorbeeld niet voorstellen dat je runtime je php code opbouwd. Waarom zou je dat bijvoorbeeld niet gewoon met functies of classes op kunnen lossen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 05 mei 2009 @ 00:02:
Ik heb wel eens een handig tooltje op basis van eval gezien.

Een soort van scratchpad waarin je direct kleine stukjes code kunt plaatsen en uitvoeren. Ideaal om bijvoorbeeld een regex te debuggen, even snel iets een ingewikkelde berekening te maken of wat te brainen.
Dat zou inderdaad een toepassing kunnen zijn, alhoewel een regexp ook wel zonder eval getest kan worden :)
Verder heb ik vooral veel workarounds gezien voor mensen die een statische functie van een class willen aanroepen waarbij de classname uit een variabele moet komen. Dat heeft ooit ergens in 1 voorbeeld op internet gestaan en sindsdien zie ik het heel vaak voorbij komen.
Dat je een static methode aan wilt roepen van een onbekende class lijkt me eerder een designfout. Het komt op mij dus meer over als een workaround vanwege slecht OO gebruik.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Kwastie schreef op maandag 04 mei 2009 @ 23:43:
Noem eens een voorbeeld wanneer je code zou willen opslaan in een database.. ?
Volgens mij doet onze hoofdvestiging dit om PLC programma's schaalbaar te maken. Minder code == kleinere CPU.

Voor een PHP applicatie zou ik het nut zo niet kunnen bedenken.
Janoz schreef op dinsdag 05 mei 2009 @ 08:54:
Ik kan mij bijvoorbeeld niet voorstellen dat je runtime je php code opbouwd. Waarom zou je dat bijvoorbeeld niet gewoon met functies of classes op kunnen lossen?
Ik heb persoonlijk nog nooit de behoefte gehad om runtime code te genereren. Ik zat er aan te denken dat je een php applicatie hebt die code genereerd voor een andere php applicatie (bijvoorbeeld een php applicatie om formulieren etc. te genereren). Zelf zou ik dat oplossen met een generieke manier, maar ik was even hardop aan het nadenken waarom je zo'n constructie zou gebruiken. :)

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op dinsdag 05 mei 2009 @ 08:58:
[...]

Dat zou inderdaad een toepassing kunnen zijn, alhoewel een regexp ook wel zonder eval getest kan worden :)
Klopt, maar dat is maar 1 voorbeeldje, je kunt met zo'n toepassing natuurlijk alles testen wat je maar kunt verzinnen.
[...]

Dat je een static methode aan wilt roepen van een onbekende class lijkt me eerder een designfout. Het komt op mij dus meer over als een workaround vanwege slecht OO gebruik.
Zit wat in, al hoeft de class niet onbekend te zijn natuurlijk maar gewoon 1 uit een optie van 4 bijvoorbeeld. Dan kan ik me voorstellen dat men snel naar een dergelijke constructie zal gaan grijpen.

Ik kan er zo snel ook geen use case bij verzinnen, maar dat is een manier waarop ik het ooit toegepast heb gezien.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op woensdag 06 mei 2009 @ 11:57:
Zit wat in, al hoeft de class niet onbekend te zijn natuurlijk maar gewoon 1 uit een optie van 4 bijvoorbeeld. Dan kan ik me voorstellen dat men snel naar een dergelijke constructie zal gaan grijpen.
Nee, dan doe je gewoon een static call en negeer je de E_STRICT error waar je toch niets zonder eval aan kan doen. Zodra je 5.3 vereist kan je het netjes doen.

{signature}


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Verwijderd schreef op dinsdag 05 mei 2009 @ 00:02:
Ik heb wel eens een handig tooltje op basis van eval gezien.

Een soort van scratchpad waarin je direct kleine stukjes code kunt plaatsen en uitvoeren. Ideaal om bijvoorbeeld een regex te debuggen, even snel iets een ingewikkelde berekening te maken of wat te brainen.

Verder heb ik vooral veel workarounds gezien voor mensen die een statische functie van een class willen aanroepen waarbij de classname uit een variabele moet komen. Dat heeft ooit ergens in 1 voorbeeld op internet gestaan en sindsdien zie ik het heel vaak voorbij komen.

In PHP 5.3.0 en hoger is dat static aanroepen gefixed dat het werkt zoals je zou verwachten.
Zoiets bedoel je?

http://nl2.php.net/call_user_func
PHP:
1
2
3
4
5
6
7
8
9
10
11
class myclass {
    static function say_hello()
    {
        echo "Hello!\n";
    }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello'); // As of 5.2.3

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Leuk stukje code, maar hoe kom je uberhaupt in een situatie terecht waarbij je een static methode aan wilt roepen van onbekende class? Zoals ik eerder al aangaf, volgens mij schort er dan wat in je design.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb een "schaakengine" gemaakt. Waar het mij om gaat is dat in design, stuk-type elke keer anders is (een eigen Class). De functie "PossibleMoves()" is bij elk (instantie van) stuk-Class aanwezig. Is dit slecht design? Of is dit een onterecht pleidooi tegenover jou, Janoz?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 06 mei 2009 @ 15:36:
Ik heb een "schaakengine" gemaakt. Waar het mij om gaat is dat in design, stuk-type elke keer anders is (een eigen Class). De functie "PossibleMoves()" is bij elk (instantie van) stuk-Class aanwezig. Is dit slecht design? Of is dit een onterecht pleidooi tegenover jou, Janoz?
Je hebt dan toch een (abstract) base-type Stuk, waar elk stuk van inherit en een eigen implementatie van PossibleMoves heeft?

Dan weet je toch gewoon welke method je aan moet roepen, en hoe je helemaal niks met call_user_func te doen.

Waar Janoz op doelt is dat een static function een eigenschap van een class is, en als je niet weet op welke class je die uit wil voeren is het nogal zinloos. Anders hadden er ook wel "static interfaces" geweest ;)

[ Voor 14% gewijzigd door Woy op 06-05-2009 15:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op woensdag 06 mei 2009 @ 15:36:
Ik heb een "schaakengine" gemaakt. Waar het mij om gaat is dat in design, stuk-type elke keer anders is (een eigen Class). De functie "PossibleMoves()" is bij elk (instantie van) stuk-Class aanwezig. Is dit slecht design? Of is dit een onterecht pleidooi tegenover jou, Janoz?
Het is slecht design wanneer die methode static is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Maghiel
  • Registratie: Maart 2004
  • Laatst online: 14:42
Voutloos schreef op woensdag 06 mei 2009 @ 12:27:
[...]
Nee, dan doe je gewoon een static call en negeer je de E_STRICT error waar je toch niets zonder eval aan kan doen. Zodra je 5.3 vereist kan je het netjes doen.
Professionals treat all warnings as errors.
Amateurs ignore warnings.
Idiots suppress warnings.

Acties:
  • 0 Henk 'm!

Verwijderd

Voutloos schreef op woensdag 06 mei 2009 @ 12:27:
[...]
Nee, dan doe je gewoon een static call en negeer je de E_STRICT error waar je toch niets zonder eval aan kan doen. Zodra je 5.3 vereist kan je het netjes doen.
Que? Hoe zou dat eruit zien dan?
LuCarD schreef op woensdag 06 mei 2009 @ 12:32:
[...]

Zoiets bedoel je?

http://nl2.php.net/call_user_func
PHP:
1
2
3
4
5
6
7
8
9
10
11
class myclass {
    static function say_hello()
    {
        echo "Hello!\n";
    }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello'); // As of 5.2.3
Call_user_func is bijna net zo evil als eval ;)

(Al heb ik die ooit wel eens nuttig gebruikt, tenminste de call_user_func_array functie)

[ Voor 47% gewijzigd door Verwijderd op 07-05-2009 03:10 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
Verwijderd schreef op donderdag 07 mei 2009 @ 03:09:
[...]

Que? Hoe zou dat eruit zien dan?


[...]

Call_user_func is bijna net zo evil als eval ;)

(Al heb ik die ooit wel eens nuttig gebruikt, tenminste de call_user_func_array functie)
Ik kan me het gebruik ervan voorstellen als je zelf een functie schrijft die een beetje lijkt op array_map(). Totdat PHP lambda functies ondersteund kan je dat imho het beste oplossen met een call_user_func() en is dat nog altijd overzichtelijker dan eval.

Er zijn ook libraries die extensief gebruik maken van callbacks en als je dan je eigen callbacks wilt schrijven kun je er ook gebruik van maken. (PHP-GTK2 bijv. )

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Janoz schreef op zondag 03 mei 2009 @ 14:53:
@Hacku:

Ik heb lang nagedacht, maar ik heb niet 1 voorbeeld kunnen vinden waarvoor niet een nettere oplossing was :).
vBulletin heeft naar mijn idee een voorbeeld waarin je eval kan gebruiken. Zij hebben namelijk een plugin systeem waar je php code kan invoeren, die dan op verschillende plekken in de code geladen wordt. Op deze manier hoef je de originele php files niet te editen waardoor je geen gezeik hebt bij een forum upgrade. Het plugin systeem is uiteraard enkel toegankelijk voor mensen met administrator rechten.

Afbeeldingslocatie: http://tweakers.net/ext/f/xcg3Zym6XkkyHvp2YFf6ycHD/thumb.png

PHP:
1
($hook = vBulletinHook::fetch_hook('bbcode_parse_complete')) ? eval($hook) : false;


Maar dit kan je weer niet cachen en is trager. In vBulletin 4 gaan ze dit ook helemaal anders aanpakken.

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Dit is juist een slecht voorbeeld IMHO.

Ze zijn gewoon te lui om een fatsoenlijk plugin systeem te schrijven en gebruiken daarom maar eval als shortcut.

Als we nu nog in PHP3 leefde, maar PHP5 is inmiddels al flink lang op de markt en biedt alle mogelijkheden om een volwaardig plugin systeem te schrijven zonder gebruik te maken van eval.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
vBulletin 3.x moet PHP4 compatible zijn ;) Zoals ik al zei, in vBulletin 4 gaan ze dit anders oplossen (wordt dan ook PHP >= 5.2 only software).

March of the Eagles


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Janoz schreef op dinsdag 05 mei 2009 @ 08:58:
Dat je een static methode aan wilt roepen van een onbekende class lijkt me eerder een designfout. Het komt op mij dus meer over als een workaround vanwege slecht OO gebruik.
Da's ook onzin. PHP implementeert function "pointers" middels strings. Er is niets mis met het gebruiken van het concept function pointers, maar als je je vervolgens door een inherent slecht ontworpen taal in moeilijke bochten moet wringen om een pointer te maken naar een static functie, so be it. Dit nog even naast het feit dat je static functies natuurlijk weldegelijk gewoon aan kunt roepen zonder eval(), zoals eerder al gedemonstreerd ;)
Kwastie schreef op maandag 04 mei 2009 @ 23:43:
Wil je wel eens een 'webbased' php 'commandline' gebruiken? Ik log veel liever in op mijn server via ssh en beheer zo mijn server. _/-\o_
Nou doe ik het niet voor het beheer voor mijn server, maar ik heb ook een PHP tooltje waarmee ik op een webpagina wat even random code kan tikken en met de druk op de knop kan uitvoeren. Gebruik ik vooral tijdens discussies hier op GoT. Een stuk makkelijker dan een file aanmaken en er dan naartoe surfen, zeker als dat betekent dat je moet FTP'en omdat je op je werk zit en daar geen PHP of webserver geïnstalleerd hebt staan :). En idd, dit is mijn enige gebruik van eval() in PHP die ik ooit heb toegepast ;)
Verwijderd schreef op donderdag 07 mei 2009 @ 03:09:
Call_user_func is bijna net zo evil als eval ;)
Onzin.

.edit: woei, lekker oude posts reageer ik weer op 8)7

[ Voor 58% gewijzigd door .oisyn op 27-05-2009 11:09 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom dan? Niets mis met function pointers. Doeterniettoe haalde er een perfect voorbeeld bij: array_map()

[ Voor 101% gewijzigd door .oisyn op 27-05-2009 11:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je call_user_func bijna net zo evil noemt, moet je misschien maar eens de documentatie lezen en verschil tussen die functie en eval() ontdekken.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Omdat veel mensen niet goed begrijpen wat het is en waarom het bestaat. Daardoor wordt het vaak gebruikt op plaatsen waar het helemaal niet gebruikt zou moeten worden en is het een lapmiddel om een slecht design op te lossen. Daarnaast geeft het in een hoop gevallen een beveiligingslek.

Dat wil dus niet zeggen dat het concept an sich evil is, maar het gebruik er van vaak wel.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op woensdag 27 mei 2009 @ 11:20:
Omdat veel mensen niet goed begrijpen wat het is en waarom het bestaat. Daardoor wordt het vaak gebruikt op plaatsen waar het helemaal niet gebruikt zou moeten worden en is het een lapmiddel om een slecht design op te lossen.
Dit hele verhaal gaat ook op voor PHP zelf. Dus eigenlijk zeg je dat PHP bijna net zo evil is als eval()?
Daarnaast geeft het in een hoop gevallen een beveiligingslek.
In precies net zoveel gevallen als include(). Namelijk wanneer je externe input in dat ding gaat stoppen. Ik heb echter nog nooit iemand horen zeuren over het evil zijn van include(). Wel dat je er geen externe input in moet stoppen. Dat geldt net zo goed voor call_user_func(), maar dat maakt het nog niet evil. En het bouwen van SQL statements was ook nooit evil (hoewel er tegenwoordig wat betere alternatieven beschikbaar zijn).

Begrijp me niet verkeerd, ik vind de hele aanpak van function pointers in PHP poorly designed, en er zijn tal van issues die je niet zou hebben als je gewoon een first class reference naar een functie zou kunnen hebben. Maar dit staat los van het gebruik ervan.

[ Voor 26% gewijzigd door .oisyn op 27-05-2009 11:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hacku schreef op woensdag 27 mei 2009 @ 10:37:
[...]


vBulletin heeft naar mijn idee een voorbeeld waarin je eval kan gebruiken. Zij hebben namelijk een plugin systeem waar je php code kan invoeren, die dan op verschillende plekken in de code geladen wordt. Op deze manier hoef je de originele php files niet te editen waardoor je geen gezeik hebt bij een forum upgrade. Het plugin systeem is uiteraard enkel toegankelijk voor mensen met administrator rechten.
[...]
En dat is nog nooit misgegaan ofzo (naast het performance-probleempje). Maar je hebt gelijk: het is een voorbeeld; helaas geen voorbeeld van goed gebruik ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op woensdag 27 mei 2009 @ 11:26:
[...]

Dit hele verhaal gaat ook op voor PHP zelf. Dus eigenlijk zeg je dat PHP bijna net zo evil is als eval()?
Ja je hebt gelijk, in feite zeg ik dat en dan lijk ik nog gelijk te hebben ook :+
[...]

In precies net zoveel gevallen als include(). Namelijk wanneer je externe input in dat ding gaat stoppen. Ik heb echter nog nooit iemand horen zeuren over het evil zijn van include(). Wel dat je er geen externe input in moet stoppen. Dat geldt net zo goed voor call_user_func(), maar dat maakt het nog niet evil. En het bouwen van SQL statements was ook nooit evil (hoewel er tegenwoordig wat betere alternatieven beschikbaar zijn).
Mwah, in zoverre dat men wel redelijk snapt hoe include werkt maar ook daar mensen soms hele aparte constructies erop nahouden.

Het probleem bij call_user_func is dat mensen het niet snappen en daarom verkeerd gebruiken, daar waar een include toch een vrij basic concept is wat de meeste mensen wel een beetje snappen. Al is dat ook weer niet zo, er zijn PHP proggers die het verschil niet snappen tussen require, require_once, include en include_once.
Begrijp me niet verkeerd, ik vind de hele aanpak van function pointers in PHP poorly designed, en er zijn tal van issues die je niet zou hebben als je gewoon een first class reference naar een functie zou kunnen hebben. Maar dit staat los van het gebruik ervan.
True

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op woensdag 27 mei 2009 @ 23:14:
[...]

Ja je hebt gelijk, in feite zeg ik dat en dan lijk ik nog gelijk te hebben ook :+
Touché :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Nu online
.oisyn schreef op woensdag 27 mei 2009 @ 11:26:
[...]

Dit hele verhaal gaat ook op voor PHP zelf. Dus eigenlijk zeg je dat PHP bijna net zo evil is als eval()?


[...]

In precies net zoveel gevallen als include(). Namelijk wanneer je externe input in dat ding gaat stoppen. Ik heb echter nog nooit iemand horen zeuren over het evil zijn van include(). Wel dat je er geen externe input in moet stoppen. Dat geldt net zo goed voor call_user_func(), maar dat maakt het nog niet evil. En het bouwen van SQL statements was ook nooit evil (hoewel er tegenwoordig wat betere alternatieven beschikbaar zijn).

Begrijp me niet verkeerd, ik vind de hele aanpak van function pointers in PHP poorly designed, en er zijn tal van issues die je niet zou hebben als je gewoon een first class reference naar een functie zou kunnen hebben. Maar dit staat los van het gebruik ervan.
Het duurde nog lang totdat deze reactie kwam, gelukkig hoef ik hem nu niet te maken :+

Ergens in het begin ging het over, dan zet je de code toch in een bestand en doe je het dan includen, toen had ik ook al zoiets van, en wat is dan het verschil tussen eval? behalve dat het wegschrijven naar een bestand en dan include doen meer code en dus tijd kost.

Of de opmerking van er zijn standaard template parsers, dan gebruik je die toch. Net alsof die intern geen eval doen, of een include doen op gecachte template bestanden.

Als het over eval gaat schreeuwd ineens iedereen moord en brand, maar de oplossingen die bedacht zijn, zijn allemaal net zo evil als dat eval zelf is
Pagina: 1