Websiteentwicklung: PHP: Datenübergabe

Oft müssen Daten zwischen ein oder mehreren Seiten ausgetauscht werden. Beispiele sind Suchfunktionen (ich gebe auf einer Seite einen Text ein und erhalte die Suchergebnisse auf einer anderen Seite), Login-Formulare (ich gebe einen Benutzernamen und ein Passwort ein und werde dann eingeloggt) "Einkaufswagen" wie sie auf vielen Shopping-Webseiten zu finden sind, Kontaktformulare und vieles mehr.

Daten, die aus einer fremden Quelle - in diesem Fall einem Nutzer - stammen, kann niemals vertraut werden!

Arten der Datenübergabe

Bearbeiten

Grundsätzlich stehen vier Arten der Datenübergabe zur Verfügung:

  • die Übergabe mittels URL, genannt $_GET
  • die Übergabe aus einem (HTML)-Formular heraus, genannt $_POST
  • die Speicherung der Daten in einer Session, $_SESSION
  • die Speicherung von Daten in einem Cookie, $_COOKIE

Dieses Kapitel beschäftigt sich nur mit $_GET und $_POST!

Welche Übergabeart wofür?

Bearbeiten

Die Art der Datenübergabe hängt hauptsächlich vom Einsatzzweck ab.

$_GET wird mit der URL übertragen und damit öffentlich, die URL kann abgespeichert und an andere verschickt werden. $_GET eignet sich damit für alles, was keine Zustandsänderung auslöst, zum Beispiel eine Suche, die Auswahl eines Artikels usw.

$_POST wird für den (normalen!) Benutzer unsichtbar im Hintergrund übertragen. Es eignet sich daher sowohl für größere Datenmengen als auch für Zustandsänderungen wie einloggen, ausloggen, den Abschluss eines Kaufes usw.

Eine Session ($_SESSION) wird auf dem Server gespeichert und ist für den Benutzer nicht erreichbar. Hier können sowohl größere Datenmengen als auch Prüfsummen gespeichert werden, um die Sicherheit zu erhöhen. Um die Daten eines Nutzers über längere Zeiträume / mehrere Seiten zu behalten, wird oft $_SESSION genutzt. Weiteres im Kapitel PHP: Sessions.

$_COOKIE wird bei dem Benutzer gespeichert. Ein Benutzer kann Cookies abstellen oder für die Webseite nicht akzeptieren.


Variablenübergabe mit POST

Bearbeiten

Erstellen Sie als erstes zwei PHP-Dateien. Eine mit dem Namen index.php und eine andere, die index2.php heißt. In die "index.php" schreiben Sie nun

 <!DOCTYPE html>
 <html>
     <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 das Attribut method="post" im form-Tag. In die "index2.php" schreiben Sie:

 <?php
 $ausgabe = 'Sie sind ';
 $ausgabe .= htmlspecialchars($_POST['alter']);
 $ausgabe .= ' Jahre alt'; 
 echo $ausgabe;
 ?>

method="post" sagt aus, dass PHP die Formulardaten in der globalen (Array-)Variablen $_POST[] ablegt. In der "index2.php" müssen die Formulardaten deshalb mit $_POST[] abgerufen werden.

Sicherheitshinweise

Bearbeiten

Alle Daten, 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 Daten, die Sie gerade empfangen haben, manipuliert sind und Sonderzeichen enthalten, 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'] : '';</soursyntaxhighlightce>
|-
|valign="top" | '''2.)'''
|In der übergebenen Variable ist HTML-Code oder Browser-Script-Code (JavaScript) enthalten. Wird dieser wieder im Browser ausgegeben, 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. <syntaxhighlight lang="php">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:
  • Alle Dateien, die von einem PHP-Script zum Speichern von Daten genutzt werden, in einem Ordner speichern, der NICHT durch eine Web-Freigabe öffentlich ist
  • Aus allen Werten, die gespeichert werden sollen, die < und > entfernen. z.B. mit dem Befehl htmlentities();
    htmlentities($_GET['alter'],ENT_QUOTES);
    
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');";
Deshalb 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 array_walk() führt die oben definierte Funktion "mysql_escape" über alle Teile des Arrays $_GET aus. Dies kann genauso auf die Arrays $_POST oder $_COOKIE angewandt werden.

addslashes() ist möglicherweise unzureichend!