PHP
Leseanforderungsdaten
Suche…
Bemerkungen
Wahl zwischen GET und POST
GET- Anforderungen eignen sich am besten zum Bereitstellen von Daten, die zum Rendern der Seite benötigt werden, und können mehrfach verwendet werden (Suchabfragen, Datenfilter usw.). Sie sind Teil der URL, was bedeutet, dass sie mit einem Lesezeichen versehen werden können und häufig wiederverwendet werden.
POST- Anfragen dagegen sind dafür gedacht, Daten nur einmal an den Server zu senden (Kontaktformulare, Anmeldeformulare ...). Im Gegensatz zu GET, das nur ASCII akzeptiert, ermöglichen POST-Anforderungen auch binäre Daten, einschließlich Dateiuploads .
Eine ausführlichere Erklärung der Unterschiede finden Sie hier .
Anfordern von Datenanfälligkeiten
Schauen Sie sich auch an: Was sind die Schwachstellen beim direkten Einsatz von GET und POST?
Das Abrufen von Daten aus den Superglobalen $ _GET und $ _POST ohne Validierung wird als schlechte Praxis angesehen und bietet Benutzern die Möglichkeit, durch Code- oder SQL-Injektionen auf Daten zuzugreifen oder diese zu beeinträchtigen. Ungültige Daten sollten überprüft und zurückgewiesen werden, um solche Angriffe zu verhindern.
Anforderungsdaten sollten abhängig davon, wie sie im Code verwendet werden, escapen, wie hier und hier angegeben . In dieser Antwort finden Sie einige verschiedene Escape-Funktionen für häufige Datenverwendungsfälle.
Fehler beim Hochladen von Dateien
$_FILES["FILE_NAME"]['error']
(wobei "FILE_NAME"
der Wert des "FILE_NAME"
der Dateieingabe ist, der in Ihrem Formular vorhanden ist) kann einen der folgenden Werte enthalten:
-
UPLOAD_ERR_OK
- Es ist kein FehlerUPLOAD_ERR_OK
, die Datei wurde erfolgreich hochgeladen. -
UPLOAD_ERR_INI_SIZE
- Die hochgeladene Datei überschreitet die Direktivephp.ini
in derphp.ini
. -
UPLOAD_ERR_PARTIAL
- Die hochgeladene Datei überschreitet die im HTML-Formular angegebene MAX_FILE_SIZE-Direktive. -
UPLOAD_ERR_NO_FILE
- Es wurde keine Datei hochgeladen. -
UPLOAD_ERR_NO_TMP_DIR
- Ein temporärer Ordner fehlt. (Ab PHP 5.0.3). -
UPLOAD_ERR_CANT_WRITE
-UPLOAD_ERR_CANT_WRITE
beim Schreiben der Datei auf die Festplatte. (Ab PHP 5.1.0). -
UPLOAD_ERR_EXTENSION
- Eine PHP-Erweiterung hat denUPLOAD_ERR_EXTENSION
angehalten. (Ab PHP 5.2.0).
Eine grundlegende Möglichkeit, nach Fehlern zu suchen, lautet wie folgt:
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
POST-Daten lesen
Daten von einer POST-Anforderung werden in Form eines assoziativen Arrays im superglobal $_POST
gespeichert.
Beachten Sie, dass beim Zugriff auf ein nicht vorhandenes Array-Element eine Benachrichtigung generiert wird. Die Existenz sollte daher immer mit der isset()
oder empty()
Funktion oder dem Null-Koaleszenz-Operator überprüft werden.
Beispiel:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
GET-Daten lesen
Daten aus einer GET-Anforderung werden in Form eines assoziativen Arrays im superglobal $_GET
gespeichert.
Beachten Sie, dass beim Zugriff auf ein nicht vorhandenes Array-Element eine Benachrichtigung generiert wird. Die Existenz sollte daher immer mit der isset()
oder empty()
Funktion oder dem Null-Koaleszenz-Operator überprüft werden.
Beispiel: (für URL /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
POST-Rohdaten lesen
In einer POST-Anforderung gesendete Daten sind normalerweise strukturierte Schlüssel / Wert-Paare mit einem MIME- application/x-www-form-urlencoded
. Viele Anwendungen, wie z. B. Web-Services, erfordern jedoch das Senden von Rohdaten, häufig im XML- oder JSON-Format. Diese Daten können mit einer von zwei Methoden gelesen werden.
php://input
ist ein Stream, der Zugriff auf den rohen Anfragetext ermöglicht.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
ist eine globale Variable, die die POST-Rohdaten enthält. Es ist nur verfügbar , wenn die always_populate_raw_post_data
Direktive in php.ini
aktiviert ist.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
Diese Variable ist seit PHP Version 5.6 veraltet und wurde in PHP 7.0 entfernt.
Beachten Sie, dass keine dieser Methoden verfügbar ist, wenn für den Inhaltstyp multipart/form-data
ist, die für das Hochladen von Dateien verwendet werden.
Hochladen von Dateien mit HTTP PUT
PHP bietet Unterstützung für die HTTP-PUT-Methode, die von einigen Clients zum Speichern von Dateien auf einem Server verwendet wird. PUT-Anforderungen sind viel einfacher als das Hochladen einer Datei mit POST-Anforderungen. Sie sehen etwa so aus:
PUT /path/filename.html HTTP/1.1
In Ihren PHP-Code würden Sie dann so etwas tun:
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
Auch hier können Sie interessante SO-Fragen / Antworten zum Empfang von Dateien über HTTP PUT lesen.
Übergeben von Arrays per POST
Normalerweise führt ein an PHP übergebenes HTML-Formularelement zu einem einzelnen Wert. Zum Beispiel:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
Daraus ergibt sich folgende Ausgabe:
Array
(
[foo] => bar
)
Es kann jedoch Fälle geben, in denen Sie ein Array von Werten übergeben möchten. Dies kann erreicht werden, indem dem Namen der HTML-Elemente ein PHP-ähnliches Suffix hinzugefügt wird:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
Daraus ergibt sich folgende Ausgabe:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
Sie können die Array-Indizes auch als Zahlen oder Strings angeben:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
Welche gibt diese Ausgabe zurück:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
Diese Technik kann verwendet werden, um Nachbearbeitungsschleifen im $_POST
Array zu vermeiden, wodurch der Code schlanker und prägnanter wird.