Websiteentwicklung: PHP: Variablenübergabe
Aus Wikibooks
Die Variablenübergabe kann man mit Post oder Get realisieren. Meistens ist es jedoch sinnvoller Post zu verwenden, weil bei Get die Anzahl von Variablen, die übergeben werden können, begrenzt ist. Allerdings kann Get sinnvoll sein, wenn man überprüfen will, was übertragen wird.
[Bearbeiten] Variablenübergabe mit POST
Mit PHP kann man auch Variablen von einer Seite zu einer anderen übergeben. Erstellen Sie als erstes zwei PHP-Dateien. Eine mit dem Namen index.php und eine andere, die index2.php heißt. In die erste Datei schreiben Sie nun
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> <head> <title>Eine PHP-Testseite</title> </head> <body> <form action="index2.php" method="post"> <fieldset> <legend>Alterseingabe</legend> <label for="alter">Geben Sie bitte Ihr Alter an</label> <input type="text" name="alter" id="alter" /> <input type="submit" value="OK" /> </fieldset> </form> </body> </html>
Wichtig ist dabei method="post"
und in die zweite Datei
<?php echo 'Sie sind '.$_POST['alter'].' Jahre alt'; ?>
method="post" sagt aus, dass wir in der index2.php die übergebende Variable mit $_POST[] (ggf. $HTTP_POST_VARS[]) abrufen müssen.
[Bearbeiten] Variablenübergabe mit GET
Beim obigen Beispiel können wir nun auch method="get" wählen. Bei der GET-Übergabe werden die Variablen in der Adresse mit übergeben, und nicht im Hintergrund wie bei POST.
Die Variablenübergabe funktioniert mit GET genau wie bei POST, nur dass statt $_POST[] nun $_GET[] oder $HTTP_GET_VARS[] geschrieben werden muss. Somit kann man Variablen ganz einfach über die URL übergeben (z.B. index2.php?alter=34).
<?php echo 'Ich bin ' . $_GET['alter'] . ' Jahre alt'; ?>
Variablen können auch über Sessions gespeichert und übergeben werden, siehe dazu PHP: Sessions.
[Bearbeiten] Sicherheitshinweis
Alle Variablen die Sie von einem Client bekommen müssen Sie auf Gültigkeit und Sicherheit überprüfen. Wenn Sie dies vernachlässigen kann das zu gravierenden Sicherheitsproblemen führen:
- Layout der Web-Seite wird durch falsche HTML-Tags zerstört
- Bösartige Java-Scripte manipulieren die HTML-Seite im Browser
- Illegale Inhalte können, durch dritte, auf dem Server gespeichert werden
- Ein Hacker kann eigenen PHP-Code einschleusen (die Folge: löschen/auslesen/manipulieren von Daten auf dem Server)
Gehen Sie immer davon aus, dass die Variable, die Sie gerade empfangen haben, manipuliert ist und Sonderzeichen enthält, die den Programmablauf verändern können. Vergewissern Sie sich deshalb immer, dass die folgenden Punkte erfüllt werden:
| 1.) | Variable nicht initialisiert: Dies kann dazu führen, dass eine Warnung von PHP angezeigt wird, die dem potentiellem Hacker Informationen über den Aufbau des PHP-Skriptes verrät. Verwenden Sie deshalb immer den Befehl isset(); in Verbindung mit einer verkürzten If-Anweisung
isset($_GET['alter']) ? $_GET['alter'] : ''; |
| 2.) | In der übergebenen Variable ist HTML-Code oder Browser-Script-Code (JavaScript) enthalten. Wenn dieser wieder im Browser ausgegeben werden, kann das Layout verloren gehen oder es kann "bösartiger" Java-Script-Code ausgeführt werden. Für diesen Fall müssen Sie unbedingt alle < und > "verhüllen". Am einfachsten verwenden Sie hierfür den PHP Befehl htmlentities(), der alle HTML Sonderzeichen umwandelt.
htmlentities($_GET['alter'],ENT_QUOTES); |
| 3.) | Sie wollen den Wert der übergebenen Variable in eine Datei speichern und es ist PHP-Code in der Variablen enthalten. Dies ist die größte Gefahr, die von einer übergebenen Variable ausgeht, da ein Hacker, wenn der diese "Speicher-Daten" von seinem Client aufrufen kann, Zugriff auf den gesamten Server erlangen kann. Um das zu verhindern sollten Sie:
|
| 4.) | Wandeln Sie alle Anführungszeichen um! Wenn Sie den erhaltenen Wert in einer Datenbankabfrage verwenden wollen, müssen Sie aufpassen, da sonst weitere SQL-Befehle wie Selects oder Inserts ausgeführt werden können. Jeder Text-Wert in eine SQL-Abfrage wird in einfache (') oder doppelte (") Anführungszeichen eingeschlossen. Enthält nun der Wert das gleiche Anführungszeichen, so wird der Wert als Befehl interpretiert.
$GetValue = "ABC') UNION SELECT * FROM Tabelle_Hack WHERE ('a' = 'a";
$SQL_Query = "SELECT * FROM Tabelle_Hack WHERE (Name = '". $GetValue ."');";
echo $SQL_Query;
--Ausgabe:----------------------------
SELECT * FROM Tabelle_Hack WHERE (Name = 'ABC') UNION SELECT * FROM Tabelle_Hack WHERE ('a' = 'a');";
Desshalb ist es nötig mit dem Befehl mysql_real_escape_string() spezielle Zeichen zu maskieren.
mysql_real_escape_string($_GET['alter']); //- Ersetzt spezielle Zeichen - ' wird zu \' Vorher sollte man jedoch prüfen, ob durch Konfigurationseinstellungen von PHP externe Daten bereits maskiert werden: function mysql_escape(&$string) { if (get_magic_quotes_gpc()) { $string = stripslashes($string); } mysql_real_escape_string($string); } array_walk($_GET, 'mysql_escape'); Die PHP-interne Funktion
|

