26. April 2024

PHP: Variablen mit $_POST aus einer Form übertragen

Um Variablen aus einer HTML-Form einem PHP Script zu übergeben kann neben der GET Methode auch die etwas sicherere POST Variante verwendet werden.

Lesen Sie hier, wie man Variablen mit POST übergibt und erhalten Sie einen Einblick wie Sicherheitsprobleme auftreten können.

HTML Form mit POST

Um einem PHP Script Variablen mittels POST Übergeben zu können, benötigt man zunächst eine HTML Form, die einen passenden HTTP-Request erzeugt. Diese sieht einer HTML Form, die mit GET arbeitet sehr ähnlich, nur das als method post (Siehe Zeile 4) festgelegt wird:

<form 
    name="create-user" 
    action="createUser.php" 
    method="post"
    >
    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>

Dieses Codefragment erzeugt eine Form, mit der sich ein einfacher Nutzer mit Vorname, Name und Emailadresse anlegen lässt. Die Form ruft das PHP-Script createUser.php auf, das nach dem Klick auf Submit die Variablen mittels $_POST holen kann.

Variablen mittels $_POST holen

Die aus der Form übertragenen Variablen lassen sich nun aus dem $_POST[] Array holen. Es bietet sich an, die Abfrage in einer Funktion zu kapseln, die ein festgelegtes Fehlerverhalten hat:

<?php
function getPostParam($paramName) {
    if(isset($_POST[$paramName])) {
        return $_POST[$paramName];
    }
    //Fehlerverhalten
    return "";
}

//Beispiel Aufruf:
$emailAddress = getPostParam('email');

?>

Die Funktion gibt den Wert der Variablen zurück, sofern es im $_POST gefunden wird. Falls nicht wird hier als Fehler der leere String zurückgegeben.

Der Name eines Parameters lässt sich aus der Form ablesen. In dieser Beispielabfrage wird das Feld email abgefragt. In der Form aus dem obigen Codefragment wäre dies das dritte Input-Feld mit dem namen email.

Sicherheit

Eine nicht zu unterschätzendes Problem ist die Sicherheit der Webanwendung, wenn Parameter mittels $_POST ü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.

Die Eingabefelder müssen unbedingt validiert werden, bevor sie verwendet werden um z.B. SQL Statements zusammenzusetzen. Es ist nämlich möglich insbesondere in Textfeldern Schadcode einzufügen (Siehe Punkt Sicherheit im Artikel zu $_GET).

Würde das PHP-Script createUser.php die Anfrage von der obigen HTML Form z.B. folgendermaßen entgegennehmen:

<?php

//DB Verbindung etc.

$email = getPostParam('email');

$mySqlQuery = "INSER INTO T_EMAIL (userid, email) VALUES($generatedId, $email);";

//Abfrage ausfuehren...

?>

… so könnte ein bösartiger Nutzer in das email-Feld z.B. folgendes hineinschreiben:


Email:

Damit sähe die $mySqlQuery dann folgendermaßen aus:

 <?php

$mySqlQuery = "INSER INTO T_EMAIL (userid, email) VALUES($generatedId, test@example.org); DROP TABLE T_EMAIL;";


?>

Ohne weitere Sicherheitsprüfung würden nun zwei Abfragen ausgeführt werden. Die eine speichert die Emailadresse „test@example.org“ mit der zugehörigen ID, die andere löscht die Tabelle mit den Emails.

Versucht man versteckte Felder mit $_POST gesichert zu übertragen, so sind diese zwar nicht über die URL manipulierbar, wie es bei der GET Variante der Fall wäre, es ist aber weiterhin möglich einen gefälschten HTTP Request zu erzeugen und an den Server bzw. das Script zu senden und somit Schadcode zu injizieren.

Es gilt also wie für GET auch für POST: 

Man sollte Parametern, die per POST ü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 POST 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.

Bei der Validierung beitet es sich an verdächtige Zeichen wie Anführungszeichen herauszufiltern.

Schreibe einen Kommentar

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