29. März 2024

PHP: Variablen mit $_GET aus einer Form übertragen

Mittels $_GET lassen sich in PHP ganz einfach Variablen aus einer Form übertragen oder statisch als URL-Parameter übergeben. Allerdings ist dieses Verfahren nicht besonders sicher, da man die URL mit einem normalen Browser ganz einfach manipulieren kann und somit leicht unerwünschte Effekte hervorrufen kann.

Lesen Sie hier wie man prinzipiell Variablen mit $_GET übergibt und wieder ausliest und warum das Verfahren Sicherheitsprobleme hat.

Die Alternative „POST“ finden Sie in diesem Artikel: PHP: Variablen mit $_POST übergeben

Parameterübergabe mittels GET

Variante 1: Übergabe durch eine Form, die eine URL erzeugt

Folgendes Codefragment erzeugt eine einfache Form mit der sich ein einfach gehaltener Nutzer anlegen lassen soll:

<form 
    name="create-user" 
    action="createUser.php" 
    method="get"
    >
    Vorname: <input type="text"
                    name="firstname">
                    <br>
    Nachname: <input type="text" 
                    name="lastname">
                    <br>
    Email: <input type="text" 
                name="email">
                    <br>
    <input type="submit" 
            value="Benutzer anlegen"
            >
</form>

Die Form ruft das PHP-Script createUser.php (siehe Zeile 3 action) auf und übergibt die parameter firstname, lastname und email übder die GET Methode (siehe Zeile 4 method).

Beim klick auf dem Submit-Knopf („Benutzer anlegen“) wird das script mit den eingegebenen Werten aufgerufen. Die URL sieht dann beispielsweise so aus:

URL

Das Script createUser.php wird also nach dem Klick auf Benutzer anlegen direkt angewählt und die Parameter werden in der URL übergeben.

Variante 2: Statische Übergabe mittels eines Hyperlinks

 Wie Sie in Variante 1 bereits gesehen haben, erfogt die Übergabe der Parameter über die URL. Selbstverständlich kann man also auch diese URLs manuell erzeugen.

Möchte man beispielsweise einen statischen Link zu einem besonderen Nutzer aus einer Datenbank (z.B. der Autor eines Artikels), so kann man hierfür die passende URL einfach manuell in den Quelltext der Seite setzen:

<a 
    href="showUser.php?userid=42" 
    alt="Zum Autor dieses Artikels" >
    Das Profil des Autors ansehen
</a>.

Dieser HTML-Code würde das PHP-Script showUser.php mit dem Parameter userid = 42 aufrufen.

Wie man an diesem Beispiel sehen kann, braucht man theoretisch garkein PHP um Variablen mittels GET zu übergeben (natürlich würde man wohl aber in den meisten Fällen den Link zum Autor eines Artikels dynamisch mithilfe einer Datenbank generieren).

Holen der Parameter mittels $_GET

Das PHP Script, das von der Form oder vom statischen Link aufgerufen wird kann die Parameter nun einfach auslesen. Der Vorgehensweise ist hierbei genau die gleiche, egal ob die Parameter mit Variante 1 oder 2 übergeben wurden.

Das Auslesen eines Parameters mittels $_GET lässt sich sehr gut in einer Funktion kapseln, die folgendermaßen aussehen kann:

<?php
function getParam($paramName) {
    if(isset($_GET[$paramName])) {
        return $_GET[$paramName];
    }
    //Fehlerverhalten laesst sich beliebig festlegen
    return "";
}


//Aufruf der Funktion z.B.
$userid = getParam('userid');
?>

mit isset() lässt sich zuerst überprüfen, ob der Parameter überhaupt gesetzt wurde und falls ja, kann er zurückgegeben werden. Falls nein kann man ein beliebiges Fehlerverhatlen der Funktion festlegen. Hier wurde der leere String gewählt.

Der Beispielsaufruf sorgt nun dafür, dass der Wert des Parameters userid, sofern er übergeben wurde in die Variable $userid gespeichert wird.

Sicherheit

Eine nicht zu unterschätzendes Problem ist die Sicherheit der Webanwendung, wenn Parameter mittels $_GET übergeben und ausgelesen werden. Stellt man seine PHP Anwendung ins Netz muss man damit rechnen, dass diese irgendwann von professionellen Hackern oder sogenannten Script-Kiddies angegriffen wird.

Das besondere beim Übergeben der Parameter mittels $_GET ist, dass man alle Parameter mit handelsüblichen Browsern in der URL beliebig manipulieren kann. Ein Angreifer muss sich also nicht unbedingt damit auskennen, wie man einen HTTP-Request manipulieren kann, sondern kann einfach Schadcode direkt in der URL mit übergeben.

Wie kann das genau aussehen?

Greifen wir das Beispiel von oben noch einmal auf: Das Script showUser.php erwartet einen Parameter userid, den es z.B. so verarbeiten kann:

<?php

$userId = getParam('userid');

//DB-Verbindung etc...

$mysqlQuery = "SELECT * FROM T_USERS WHERE userid = $userid;";

//Abfrage ...

?>

Soweit so gut, wir gehen davon aus, dass eine MySQL Datenbank verwendet wird und die MySQL Statements so wie im Code gezeigt zusammengesetzt werden, bevor sie ausgeführt werden – doch was wenn ein bösartiger Nutzer auf die Idee kommt, in der Adresszeile seines Browsers folgendes einzugeben:

Cross Site Scripting Attacke!

Mit dieser URL sieht der zusammengesetzte String dann auf einmal folgendermaßen aus:

 <?php
$userid ="SELECT * FROM T_USERS WHERE userid = 3;DROP TABLE T_USERS;"
?> 

Findet hier keine weitere Sicherheitsprüfung statt, so werden zwei Datenbankanfragen ausgeführt! Die erste zeigt den Nutzer mit der id 3 an, die zweite löscht die komplette Tabelle der Benutzer.

Es lässt sich also festhalten: Man sollte Parametern, die per GET übergeben werden grundsätzlich nicht vertrauen und diese immer überprüfen bzw. validieren, bevor man sie verwendet. Von der direkten Übergabe von SQL Statements per GET ist im Allgemeinen abzuraten und die Abfrage sollte intern z.B. mit if else Statements manuell zusammengebaut werden. Auch kann es hilfreich sein in die SQL Statements einen Prüfstring einzubauen, mit dem sich ermitteln lässt, ob Schadcode eingefügt wurde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert