[PHP] uitvoeren eval(variabele)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Misschien is de topictitel wat onduidelijk, als iemand een idee heeft hoe ik het beter kan omschirjven moet hij/zij maar roepen.

Ik krijg het volgende niet aan de praat...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//Connect to SoapClient 
$client = new SoapClient('http://127.0.0.1:81/MPExtControlWS/Service.asmx?WSDL');

//Make commandstring
$commandString = ($_GET['a'] == "")? $_GET['c'] ."()" : $_GET['c'] ."(array(". $_GET['a'] ."))" ; 
$commandResultString = $_GET['c'] ."Result";

//Obtain results
$objectresult = $client->eval($commandString);
$simpleresult = $objectresult->eval($commandResultString);

echo $simpleresult;
?> 


M.b.v. AJAX roep ik de pagina aan. Er worden twee waarden meegegeven in het url. a en c.
"c" is het "command", "a" is de string "argument" (die wordt geplaatst in een array).
"a" kan leeg zijn.

Wanneer ik bijvoorbeeld het bestand aanroep met ?c=GetCurrentlyPlayingItemDetails&a=
Verwacht ik dat het volgende wordt uitgevoerd.

PHP:
1
2
$objectresult = $client->GetCurrentlyPlayingItemDetails();
$simpleresult = $objectresult->GetCurrentlyPlayingItemDetailsResult;


Misschien mis ik volledig hoe de eval() functie werkt in php (in javascript zou het zo werken naar mijn idee). Het werkt in ieder geval niet...... Iemand een idee wat ik verkeerd doe?

Ik lees overal dat de eval() functie vies is. Dus als iemand emand eventueel een andere weg naar Rome weet...? Het script haalt via een webservice data uit MediaPortal waarvoor ik een webbased remote control aan het schrijven ben.

[ Voor 4% gewijzigd door Bram77 op 20-08-2006 18:16 ]


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Volgens mij werkt dit gewoon hoor:

PHP:
1
2
3
4
<?php
$objectresult = $client->$commandString();
$simpleresult = $objectresult->$commandResultString;
?>


Zie ook: http://nl2.php.net/manual...ns.variable-functions.php
Of: http://nl2.php.net/manual/en/function.call-user-func.php

[ Voor 29% gewijzigd door BHR op 20-08-2006 18:26 . Reden: linkje erbij ]

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
He, super bedankt! Ik ging er vanuit dat dat niet zou kunnen werken.... zal wel aan mij liggen.
Zo werk het idd.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
//Connect to SoapClient 
$client = new SoapClient('http://127.0.0.1:81/MPExtControlWS/Service.asmx?WSDL');

//Make commandstring
$argumentArray = ($_GET['a'] == "")? "" : "array(". $_GET['a'] .")";
$commandResultString = $_GET['c'] ."Result";

//Obtain results
$objectresult = $client->$_GET['c']($argumentArray);
$simpleresult = $objectresult->$commandResultString;

echo $simpleresult;

Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Het lukt me alleen niet om een array op de zelfde manier te vullen......

PHP:
1
2
3
$arrayString = "\"varNaam1\"=>\"varValue1\", \"varNaam2\"=>\"varValue2\"";

$objectresult = $client->$_GET['c']($arrayString);

Werkt dus niet. Net zo min als....
PHP:
1
2
3
$arrayString = "varNaam1=>varValue1, varNaam2=>varValue2";

$objectresult = $client->$_GET['c']($arrayString);



Hier toevallig ook een suggestie voor?

Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Waarom maak je er geen echte array van?

PHP:
1
$my_array = array($a);


PHP:
1
2
3
$k = $_GET['k'];
$v = $_GET['v'];
$my_array = array($k => $v);


PS. Je realiseert je wel je een behoorlijk potentieel beveiligingsprobleem hebt met de directe $_GET injectie?

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Dat ga ik even proberen. Het 'probleem' is dat het aantal arguments vantevoren niet vast staat. Dus dan zou ik in de array() een loop zou moeten doen. Ik weet niet zeker hoe ik dat zou moeten doen, al is het misschien wel mogelijk...

PHP:
1
2
3
4
5
6
7
8
9
10
$objectresult = $client->$command(array(
for($y=0;$y<count($theArray);$y++)
{
    echo $theArray[$y] ."=>"; 
    $y++; 
    echo $theArray[$y]; 
    if($y !== (count($theArray)-1))
        echo ", ";
}
);


Wat natuurlijk niet kan..... Misschien wordt ik wel een heel stuk wijzer hier :)

Wat $_GET betreft. Het script wordt aangeroepen via AJAX (http_request.open('POST', url, true);, waar url het url+de variabelen bevat). Ik doe aan elke start van een pagina een check naar het session_id+ip_van_gebruiker (geMD5t). Bij bezoek van een niet van tevoren in de configuratie aangegeven ip moet er ingelogd worden (wordt geregistreerd in de sessie). Ook wordt er gecontroleerd of de pagina is aangeroepen via een "POST" ( $_SERVER['REQUEST_METHOD'] == 'POST')
Is het dan nogsteeds te onveilig?

[ Voor 3% gewijzigd door Bram77 op 20-08-2006 22:41 ]


Acties:
  • 0 Henk 'm!

  • brokenp
  • Registratie: December 2001
  • Laatst online: 22:15
Ja, je moet userinput NOOIT vertrouwen, een aanvaller kan ook goede sessie gegevens hebben, maar daarna via GET verkeerde gegevens sturen (client->delete ofzoiets)
Wat je zou kunnen doen als eenvoudige manier is het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
// een array van allowed operations
$AllowedOpps = Array(GetCurrentlyPlayingItemDetails(), etc, etc) 

// de manier van doorgeven maakt niet uit, en is niets veiliger
$opp=$_REQUEST['c'] 

//als de operatie is toegestaan, voer hem dan uit
if (in_array($opp, $AllowedOpps)){
    $objectresult = $client->eval($opp); 
}

Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
O.k., bedankt. Die manier ga ik toepassen. Klinkt failsafe.

Ik heb het 'array probleem' maar even lelijk en ondynamisch opgelost. Wanneer er nu nieuwe mogelijkheden komen zal ik deze code aan moeten passen, wat ik natuurlijk altijd liever voorkom. Maar zo werkt het in ieder geval.

De array wordt vanzelfsprekend in de volgende opmaak gepost...

....&a=argumentNaam1:argument1:argumentNaam2:argument2

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$argumentArray = explode(":", $_GET['a']);

$argumentArrayLength = count($argumentArray);
if($argumentArrayLength == 1)
    $objectresult = $client->$command();
else if($argumentArrayLength == 2)
    $objectresult = $client->$command(array($argumentArray[0] => $argumentArray[1]));
else if($argumentArrayLength == 4)
    $objectresult = $client->$command(array($argumentArray[0] => $argumentArray[1], $argumentArray[2] => $argumentArray[3]));
else if($argumentArrayLength == 6)
    $objectresult = $client->$command(array($argumentArray[0] => $argumentArray[1], $argumentArray[2] => $argumentArray[3], $argumentArray[4] => $argumentArray[5]));
else if($argumentArrayLength == 6)
    $objectresult = $client->$command(array($argumentArray[0] => $argumentArray[1], $argumentArray[2] => $argumentArray[3], $argumentArray[4] => $argumentArray[5], $argumentArray[6] => $argumentArray[7]));
else
    echo "Invalid Arguments";

[ Voor 4% gewijzigd door Bram77 op 20-08-2006 23:47 ]


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Wat dacht je van een loopje? :P

PHP:
1
2
3
4
5
6
7
8
9
10
$argumentArray = explode(":", $_GET['a']); 
$args = array();
for($i=0; $i<sizeof($argumentArray); $i+=2) 
{
  // aanname dat $argumentArray uit een even aantal elementen bestaat
  $args[$argumentArray[$i]] = $argumentArray[$i+1];
}
print_r($args);

$objectresult = $client->$command($args);


Niet flauw of gemeen bedoeld, maar ik heb de indruk dat php en/of arrays in php niet je sterkste punt is ;). Ik zou je adviseren om hier eens rond te kijken:
http://nl2.php.net/manual/nl/language.types.array.php
http://nl2.php.net/manual/nl/ref.array.php

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Bram77 schreef op zondag 20 augustus 2006 @ 23:44:
O.k., bedankt. Die manier ga ik toepassen. Klinkt failsafe.

Ik heb het 'array probleem' maar even lelijk en ondynamisch opgelost. Wanneer er nu nieuwe mogelijkheden komen zal ik deze code aan moeten passen, wat ik natuurlijk altijd liever voorkom. Maar zo werkt het in ieder geval.

De array wordt vanzelfsprekend in de volgende opmaak gepost...

....&a=argumentNaam1:argument1:argumentNaam2:argument2
dat kan wel wat korter:
PHP:
1
2
3
4
5
$a = explode(":", $_GET['a']);
$argumentArray = array();
for($i=0;$i < count($a); $i+=2) {
    $argumentArray[$a[$i]] = isset($a[$i+1]) ? $a[$i+1] : null; 
}


/spuit11 :+

Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
@BHR: De array bestaat inderdaad altid uit een even hoeveelheid argumenten. Je hebt mij nooit horen zeggen dat ik alle ins en outs van arrays of php ken, maar de basis ken ik wel hoor. Ik neem aan dat jij ook niet alles in een dag hebt geleerd....

Bedankt voor de hulp. print_r was de functie die ik nodig had dus.

Acties:
  • 0 Henk 'm!

  • PierreAronnax
  • Registratie: Maart 2002
  • Niet online
Voor die array kan je veel beter serialize / unserialize gebruiken.

Pierre - Motormedia.nl - Motor-Forum.nl - Motorshopper.nl - Motormeuk.nl - Motorstek.nl


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Bram77 schreef op maandag 21 augustus 2006 @ 12:32:
Bedankt voor de hulp. print_r was de functie die ik nodig had dus.
:? BHR's (en mijn spuit 11 code) draaide om alles behalve de print_r die BHR er nog bij had gezet ter illustratie? Wat ben je nou helemaal aan het doen??

Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Ik begrijp nog niet echt hoe ik de the "unserializen" string moet meegeven aan de AJAX functie zodat er na unserializen een array ondstaat die er zo uit ziet.....en wat het voordeel van unserializen is.

array("argName1"=>"arg1", "argName2"=>arg2")
Pagina: 1