[PHP] Variabele in IF statement

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • OVERLORD_1982
  • Registratie: Juni 2001
  • Laatst online: 21-06 10:31
Ik wil een dynamische IF statement creëren, hierin zitten verschillende variabelen, die met een AND of een OR met elkaar verbonden zijn.

Voordat ik de statement begin stop ik alles in een variabele en die word dan in de IF statement gezet. Als ik de variabele echo, dan ziet alles er goed uit, enkelt doet de IF statement er niets mee.

voorbeeld:
PHP:
1
2
3
4
5
6
7
$VeldCheck = "empty($Veld1)";
if ($VeldCheck) {
    echo "Het veld is leeg!";
} else {
    echo "Het veld is niet leeg";
}
//Levert ongeacht of Veld1 gevuld is "Het veld is leeg!" op.


Iemand enig idee waarom PHP (4.3.4) er niets mee lijkt te doen?

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Misschien Eval eroverheen gooien?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Je valideerd nu de string in een if statement. Of zet er eval() omheen. Niet aan te raden, of verzin een andere structuur. ;)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 16:52

Cyphax

Moderator LNX
In het voorbeeld dat jij geeft is $VeldCheck = "empty($Veld1)" een string, dus ik zou die quotes eruit halen.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Glashelder
  • Registratie: September 2002
  • Niet online

Glashelder

Anti Android

Omdat volgens mij dit niet kan. Je kan wel een variabele erin zetten maar die moet OF "true" of "false" zijn (of 0 of 1). Maar dit weet ik niet 100% zeker. Inhoud van een string wordt niet uitgevoerd ook.

[ Voor 21% gewijzigd door Glashelder op 17-11-2004 17:03 ]

PV 4915wp op oost, 2680 wp op west, 1900 wp op zuid. pvoutput - AUX 8 kW bi bloc


Acties:
  • 0 Henk 'm!

  • OVERLORD_1982
  • Registratie: Juni 2001
  • Laatst online: 21-06 10:31
Cyphax schreef op woensdag 17 november 2004 @ 17:02:
In het voorbeeld dat jij geeft is $VeldCheck = "empty($Veld1)" een string, dus ik zou die quotes eruit halen.
Ook als er geen qoutes omheen zitten levert dit hetzelfde (foute) resultaat op. Ga ff naar eval kijken.

Acties:
  • 0 Henk 'm!

Verwijderd

Lees in de uber-handleiding over de functie eval http://nl.php.net/eval

PHP:
1
2
3
4
5
6
eval("$veldCheck = empty($veld1);");

// String $veldCheck is nu een gewone toegankelijke variabele
if ($veldCheck) {

  bladiebla...


Hmm ik zie dat je al antwoord geeft op je eigen vraag :? _/-\o_

[ Voor 38% gewijzigd door Verwijderd op 17-11-2004 17:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je idd exploitable code wilt maken zou ik er een eval over heen gooien ja ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt een stap gemist.

De waarde van je string is wel een geldige PHP expressie, maar PHP ziet hem nog steeds als string; dat wil zeggen, de code die in de string staat (in dit geval een expressie) wordt niet zomaar uitgevoerd als jij met de string gaat werken.

Wat een if ($string) statement normaal betekent is: false als de string leeg is, true als de string niet leeg is. En aangezien jouw string niet leeg is, zal altijd de "true" branch gekozen worden.

Om te zorgen dat de expressie die in je string staat ook daadwerkelijk door PHP uitgevoerd wordt, moet je er, zoals gezegd, eval() omheen zetten. Dus zo:

PHP:
1
2
3
4
5
6
7
8
9
$VeldCheck = 'empty($Veld1)'; // <-- Let op de enkele haakjes!

$dynif = sprintf("return %s;", $VeldCheck);
if (eval($dynif)) {
  // ...
}
else {
  // ...
}


MAARRRR aangezien er nu willekeurige PHP code uitgevoerd kan worden zonder dat jij daar invloed op hebt, moet je dit alleen doen als je de inhoud van de string volledig vertrouwt! Oftewel, alleen als hij volledig van binnenin je script gevuld wordt. Zodra er gebruikersinvoer in terugkomt is zo'n constructie een dikke no-no.

offtopic:
Aan alle eval-afkrakers: je hoeft heus niet zo overdreven puriteins te doen. Het gebruik van een functie als eval() is niet per definitie evil (:+). Je moet alleen iets beter opletten bij het schrijven van je code. Zolang je zeker weet dat er geen onbehoorlijke dingen in je string terecht kunnen komen kan ik geen reden bedenken om eval() niet te gebruiken.

[ Voor 24% gewijzigd door Verwijderd op 17-11-2004 17:11 ]


Acties:
  • 0 Henk 'm!

Verwijderd

maar wat is dan de meerwaarde om het eerst te eval'en?

PHP:
1
2
3
4
if (empty($veldje)) 
{

}


of

PHP:
1
2
3
4
5
$blaat = "empty($veldje)";
if eval($blaat))
{

}


Sorry maar doet u mij dan maar de versie zonder eval, als je elke kans op een mogelijke exploit kunt uitbannen waarom zou je dat dan niet doen?

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 17 november 2004 @ 17:13:
maar wat is dan de meerwaarde om het eerst te eval'en?

Sorry maar doet u mij dan maar de versie zonder eval, als je elke kans op een mogelijke exploit kunt uitbannen waarom zou je dat dan niet doen?
OVERLORD_1982 schreef op woensdag 17 november 2004 @ 17:00:
Ik wil een dynamische IF statement creëren, hierin zitten verschillende variabelen, die met een AND of een OR met elkaar verbonden zijn.
Ik neem aan dat de TS de condities tijdens run-time wil aanpassen. In dat geval is het wel een stuk netter door dynamisch de condities in een string op te bouwen, en dan uiteindelijke te laten evalueren. Het alternatief is een berg geneste IFs waar een huwelijkstaart nog een puntje aan kan zuigen.

Als de conditie(s) altijd hetzelfde zijn is er inderdaad geen goede reden, maar we nemen voor het gemak maar even aan dat de TS in zijn code een voorbeeldgeval heeft willen weergeven en niet de volledige code :).

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
return ervoor? Dat is alleen voor functies hoor, en aangezien eval niet in een functie wordt uitgevoerd en een return statement al helemaal niet is toegestaan in een if statement, lijkt het me een beetje vreemd. Weet je zeker dat het klopt zo en ben ik gek of heb je een foutje gemaakt? :P

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

ik neem niks aan behalve geld :)

Maar goed, daar heb je wel gelijk in, een berg geneste if'jes is ook niet echt leesbaar.
Maar dan moet je wel heel zeker weten dat de waarde's die je wilt testen clean zijn.

Er zijn veel php systemen gehacked door het niet netjes gebruiken van de eval functies, en ik probeer enkel maar te waarschuwen dat je het moet voorkomen als het mogelijk is :)

Acties:
  • 0 Henk 'm!

  • OVERLORD_1982
  • Registratie: Juni 2001
  • Laatst online: 21-06 10:31
@ OneOfBorg

Dat is precies wat ik bedoel. Word nu bij m'n werk weggeschopt, als ik thuis ben ga ik meteen testen. TNX in advance

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op woensdag 17 november 2004 @ 17:07:

Wat een if ($string) statement normaal betekent is: false als de string leeg is, true als de string niet leeg is. En aangezien jouw string niet leeg is, zal altijd de "true" branch gekozen worden.
Als een if ($string) false returned betekent het dat deze nergens naar verwijst / niet bestaat (soort nullpointerexception). Als deze true geeft betekent of de string bevat niets bv $string = ""; of dat er wat in zit. Hoe dan ook, hij returned true als het geset is en als het niet geset is false. Even voor de duidelijkheid, eval returned alleen de expressie statement als er expliciet in die expressie een return staat vermeld, anders returned het null of false (als de exressie die ge-evalled moet worden een fatal error oplevert) (zie manual voor meer info)

[ Voor 40% gewijzigd door prototype op 17-11-2004 18:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

prototype schreef op woensdag 17 november 2004 @ 17:57:
Als een if ($string) false returned betekent het dat deze nergens naar verwijst / niet bestaat (soort nullpointerexception). Als deze true geeft betekent of de string bevat niets bv $string = ""; of dat er wat in zit. Hoe dan ook, hij returned true als het geset is en als het niet geset is false.
Bzzt. You are not a winner. Een lege string evalueert wel degelijk naar false, en een ongezette variabele levert een fout op (en evalueert inderdaad naar false, maar voor de netheid moet je er maar van uitgaan dat ongezette variabelen niet mogen). Voor de volledigheid:

PHP:
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
27
28
29
30
31
32
33
34
35
36
  error_reporting(E_ALL);

  echo "Testing PHP version " . phpversion() . "\n";

  if ($thestring)
    echo "The string exists!\n";
  else
    echo "The string does not exist!\n";

  $thestring = "";

  if ($thestring)
    echo "The empty string evaluates to true!\n";
  else
    echo "The empty string evaluates to false!\n";

  $thestring = "nonempty";

  if ($thestring)
    echo "The nonempty string evaluates to true!\n";
  else
    echo "The nonempty string evaluates to false!\n";

  $thestring = "0";

  if ($thestring)
    echo "The 0 string evaluates to true\n";
  else
    echo "The 0 string evaluates to false\n";

  $thestring = "false";

  if ($thestring)
    echo "The false string evaluates to true\n";
  else
    echo "The false string evaluates to false\n";


Levert bij mij op:

code:
1
2
3
4
5
6
7
8
Testing PHP version 4.3.9-1
<br />
<b>Notice</b>:  Undefined variable:  thestring in <b>/var/www/local/stuff/teststring.php</b> on line <b>6</b><br />
The string does not exist!
The empty string evaluates to false!
The nonempty string evaluates to true!
The 0 string evaluates to false
The false string evaluates to true

[ Voor 15% gewijzigd door Verwijderd op 17-11-2004 23:50 ]


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op woensdag 17 november 2004 @ 23:49:
[...]


Bzzt. You are not a winner. Een lege string evalueert wel degelijk naar false, en een ongezette variabele levert een fout op (en evalueert inderdaad naar false, maar voor de netheid moet je er maar van uitgaan dat ongezette variabelen niet mogen).
Dan doet php het fout en elk andere hogere programmeertaal het goed :P ;)

[ Voor 63% gewijzigd door prototype op 18-11-2004 00:11 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

prototype schreef op donderdag 18 november 2004 @ 00:11:
[...]


Dan doet php het fout en elk andere hogere programmeertaal het goed :P ;)
dat is geen kwestie van goed of fout, maar gewoon een manier waarop php omgaat met variabelen. En dat zijn gewoon dingen die je hoort te weten als je je bezig gaat houden met php. (wat overigens ook op heel veel plaatsen in de manual terug komt)

Verwijderd

prototype schreef op donderdag 18 november 2004 @ 00:11:
[...]
Dan doet php het fout en elk andere hogere programmeertaal het goed :P ;)
Dan ben ik benieuwd welke `hogere' programmeertaal niet begint te bokken als je ongedefiniëerde variabelen gebruikt, maar ze behandelt als zijnde `false'... :?

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op donderdag 18 november 2004 @ 00:40:
[...]


Dan ben ik benieuwd welke `hogere' programmeertaal niet begint te bokken als je ongedefiniëerde variabelen gebruikt, maar ze behandelt als zijnde `false'... :?
Ik doelde meer op een analogie op de nullpointerexception en probeerde deze kort door de bocht 'vrij' te vertalen naar PHP. Maar mijn interpretatie op de mixed var handling van PHP was dus niet correct, my bad :)

Vind jij trouwens $var = ""; ongedefinieerd dan? Persoonlijk vind ik dit wel degelijk gedefinieerd in de zin dat je deze variabele declareert als zijnde 'leeg', doch niet null (zoals bv $var;)

[ Voor 30% gewijzigd door prototype op 18-11-2004 00:49 ]


Verwijderd

prototype schreef op donderdag 18 november 2004 @ 00:45:
[...]

Ik doelde meer op een analogie op de nullpointerexception en probeerde deze kort door de bocht 'vrij' te vertalen naar PHP. Maar mijn interpretatie op de mixed var handling van PHP was dus niet correct, my bad :)

Vind jij trouwens $var = ""; ongedefinieerd dan? Persoonlijk vind ik dit wel degelijk gedefinieerd in de zin dat je deze variabele declareert als zijnde 'leeg', doch niet null (zoals bv $var;)
Je hebt gelijk. Persoonlijk vind ik dat een groot gemis bij veel talen (behalve Python, yayyy, en Ruby ken ik niet voldoende om daar een oordeel over te vellen). Als het aan mij zou liggen zou er voor elke variabele naast het gebruikelijke bereik waaruit het type bestaat een aparte waarde "Not assigned" bestaan, die voor alle types hetzelfde is. In onze opleiding noemen we deze waarde "bottom", in Python heet het ding "None", en in mijn PHP code probeer ik zo consistent mogelijk "null" te gebruiken voor deze waarde (dat is makkelijk te doen aangezien PHP dynamisch getypeerd is). Ik weet echter niet precies waar de "null" waarde voor bedoeld is in PHP. Is het om absentie van een waarde aan te geven? Om een lege referentie aan te geven (zoals in de meeste gecompileerde talen)? Als iemand het weet dan zou ik het graag horen. En $var = "" zou in mijn ideale interpretatie inderdaad iets anders zijn dan $var = null, maar ja, zo werkt PHP nou eenmaal niet :/.

Maar een ongedefiniëerde variabele is natuurlijk iets anders dan een variabele met ongedefiniëerde waarde, en je hoort een schop onder je broek te krijgen voor de insinuatie dat het eerste toelaatbaar is :p.
Pagina: 1