Avatar billede hhjollund Praktikant
08. oktober 2007 - 09:10 Der er 6 kommentarer og
1 løsning

"2+2": hvor svært kan det være?

$a="2+2";
Hvordan får man PHP til at evaluere ovenstående streng og give svaret 4?
Avatar billede nielle Nybegynder
08. oktober 2007 - 09:43 #1
Ikke særligt sværet, men man skal nok lige holde tungen ldt ret i munden.

Den relevant funktion hedder eval():

http://dk.php.net/eval
Avatar billede hhjollund Praktikant
08. oktober 2007 - 10:14 #2
Det virker ikke - så vidt jeg kan se svarer eval() til $$ - dvs du kan få substitueret en variabel og få det outputted til browseeren, men ikke evalueret et udtryk.
Første eksempel er fra php.met/eval()

$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";

OUTPUT: This is a $string with my $name in it. This is a cup with my coffee in it.

Mit eksempel:
$cup1 = '1';
$cup2 = '1';
eval("\$cups = \"$cup1+$cup2\";");
echo "Antal kopper: ".$cups. "\n";

OUTPUT: Antal kopper: 1+1 - og så er vi ligevidt - og jeg har endvidere brug for at få resultatet ind i en variabel.

Jeg kan jo lave en funktion, som gennemgår udtrykket karaktervis, men det virker da skørt at det skulle være nødvendigt. Any ideas?
Avatar billede pidgeot Nybegynder
08. oktober 2007 - 10:40 #3
Fjern " om udtrykket: eval("\$cups = $cup1+$cup2;"); - så ligger resultatet i $cups.

Pas dog gevaldigt på - hvis der er nogen form for brugerinput involveret her skal du være 110% sikker på der ikke er noget uventet i det input. Hvis vi nu tager dit eksempel, og siger du får $cup2 fra en $_GET-variabel er det uhyre simpelt for mig at skrive eks. ?cup2=1;mysql_query('DROP DATABASE'), eller overskrive filer.

Den sikre metode er at implementere shunting yard algoritmen - http://en.wikipedia.org/wiki/Shunting_yard_algorithm - og så evaluere det postfixudtryk man ender med.
Avatar billede hhjollund Praktikant
08. oktober 2007 - 11:04 #4
Tak for det - det var lige det der skulle til. Der er intet brugerinput her, så ingen mulighed for SQL-injection - men altid godt at holde sig in mente. Points? Nielle havde sådan set også ret - dele?
Avatar billede nielle Nybegynder
08. oktober 2007 - 12:19 #5
Det var det jeg mente med at man skulle holde tungen lige i munden. Men giv bare de fleste point til pidgeot. :^)

Rent faktisk hedder det ikke for "SQL injection" i dette tilfælde - SQL injection handler om at få sneget SQL-kode ind til databasen. Jeg mener at angrebstypen her hedder noget i stil med "eval injection" eller "eval poisoning". Den gåt på at få sneget skadelig kode ind til et sted hvor der kaldes en eval().
Avatar billede pidgeot Nybegynder
08. oktober 2007 - 12:47 #6
Bare giv det hele til Nielle ;)

Faktisk er den her type injections langt farligere end en SQL-injection, da de fleste PHP-sider bruger mysql_*-metoderne - de ignorerer ekstra queries i SQL'en, hvilket gør at det måske nok er muligt at kunne se diverse data man ikke ellers skulle se, men det bliver betydeligt sværere at få slettet eller ændret noget. Med det vi har her, er det muligt at gøre lige hvad man vil - du kan skrive en helt frisk SQL-sætning der kommer ind uden problemer, du kan overskrive eller tilføje data til filer - ja, alt der er muligt med PHP.

Du kan sågar få fat på databaselogin ved at få fat på en liste over filer, og så hive indholdet ud af dem - og så kan du ellers finde frem til PHPMyAdmin med lidt kvalificeret gætteri og logge ind uden at der er det store håb for at nogen ser hvad der bliver lavet om på derinde - afhængigt af hvad man har med at gøre kan det udgøre et gigantisk problem i længden.
Avatar billede nielle Nybegynder
08. oktober 2007 - 18:19 #7
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester