2012-04-09 4 views
0

Ich habe die Objektklasse erfolgreich instanziiert, aber ich kann nicht herausfinden, wie eine Funktion aufgerufen wird. Hier ist mein PHP-Code:Übergeben von GET-Variablen in PHP zum Instanziieren von Klassen und Aufruffunktionen

$obj = new router(); 
class router{ 

public function __construct(){ 
    if($_SERVER['REQUEST_METHOD'] == 'GET'){ 
     echo "GET"; 
     $page = 'index'; 
     $funct = 'myfuncempty'; 

     if (!empty ($_GET)){ 
      $page = $_GET['page']; 
      $funct = $_GET['func']; 
     } 
     $obj = new $page(); //instantiating object with get from class 
     $obj->funct; 
    } 
    else{ 
     echo "POST"; 
    } 

} 

} 
class index{ 

public function __construct(){ 
    echo "hello I'm index"; 
} 
public function myfunc(){ 
    echo "yo"; 
} 

public function myfuncempty(){ 
    echo "empty get"; 
} 
} 

class login{ 
public function __construct(){ 
    echo "hello I'm login"; 
} 

public function loggedin(){ 
    echo "you're logged in"; 
} 

public function loggedinempty(){ 
    echo "its empty"; 
} 
} 

Und das ist das HTML-Formular, das ich Variablen über GET übergeben verwenden:

<html> 
<head></head> 
<body> 
<form action="index.php" method="POST"><input type ="text" name="page" id="page" /><input type="submit" /></form> 
<form action="index.php" method="GET">Page:<input type="text" name="page" id="page" />Function:<input type="text" name="func" id="func" /><input type= "submit" /> 
</body> 
</html> 

Wenn ich Index in für Seite eingeben und MyFunc in für die Funktion, I erhalten diese Antwort:

GEThello I'm login Notice: Undefined property: login::$funct in /home/cr47/public_html/final_project/index.php on line 27 

Also, es die ‚Seite‘ richtig und instanziieren das Objekt ist vorbei, aber es nicht richtig ist, die myfunc Funktion aufrufen. Irgendwelche Ideen?

+2

Klaffendes Sicherheitsloch. – ThiefMaster

+0

@ThiefMaster Was, werden Hacker in die Maschine eindringen, ihre eigene kompromittierte Klasse erstellen und sie mit einem $ _GET-Parameter instanziieren? – pp19dd

+0

Die Chancen stehen gut, dass es Klassen in seiner Anwendung oder eingebaute PHP-Klassen gibt, die nicht "sicher" sind, wenn jemand beliebige Methoden aufrufen kann. Auch wenn das Risiko nur moderat ist, ohne dass man Argumente vorbringen kann. Trotzdem können Sie zumindest Fehler verursachen, die dann in eine Logdatei eindringen oder E-Mails an jemanden auslösen können. – ThiefMaster

Antwort

2

ersetzen $obj->funct; mit $obj->$funct();

Aber vorsichtig sein. Sie sollten nicht zulassen, dass Ihre Benutzer willkürliche Klassen instanziieren. Verwenden Sie zumindest eine Whitelist oder fordern Sie an, dass diese eine Unterklasse einer benutzerdefinierten Klasse ist, die nur von Ihren sicheren Klassen verwendet wird (d. H. Keine öffentlichen Methoden, die etwas tun, was ein Benutzer nicht tun darf).

+0

Danke! Es funktionierte. :) Ich würde nie so etwas auf einer tatsächlichen Website tun. Es ist nur eine Hausaufgabe, an der ich das ganze Wochenende festgehalten habe. Ich nahm an, dass es nur eine Syntax war, die ich nicht verstand. – CR47

Verwandte Themen