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:

  1. UPLOAD_ERR_OK - Es ist kein Fehler UPLOAD_ERR_OK , die Datei wurde erfolgreich hochgeladen.
  2. UPLOAD_ERR_INI_SIZE - Die hochgeladene Datei überschreitet die Direktive php.ini in der php.ini .
  3. UPLOAD_ERR_PARTIAL - Die hochgeladene Datei überschreitet die im HTML-Formular angegebene MAX_FILE_SIZE-Direktive.
  4. UPLOAD_ERR_NO_FILE - Es wurde keine Datei hochgeladen.
  5. UPLOAD_ERR_NO_TMP_DIR - Ein temporärer Ordner fehlt. (Ab PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE - UPLOAD_ERR_CANT_WRITE beim Schreiben der Datei auf die Festplatte. (Ab PHP 5.1.0).
  7. UPLOAD_ERR_EXTENSION - Eine PHP-Erweiterung hat den UPLOAD_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";
7,0
$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";
7,0
$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);
5.6

$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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow