Zoeken…


Opmerkingen

Kiezen tussen GET en POST

GET- aanvragen zijn het beste voor het verstrekken van gegevens die nodig zijn om de pagina weer te geven en die meerdere keren kunnen worden gebruikt (zoekopdrachten, gegevensfilters ...). Ze maken deel uit van de URL, wat betekent dat ze een bladwijzer kunnen zijn en vaak worden hergebruikt.

POST- aanvragen zijn daarentegen bedoeld om gegevens slechts één keer naar de server te verzenden (contactformulieren, inlogformulieren ...). In tegenstelling tot GET, dat alleen ASCII accepteert, staan POST-aanvragen ook binaire gegevens toe, inclusief bestandsuploads .

U kunt een meer gedetailleerde uitleg van hun verschillen te vinden hier .

Verzoek om gegevenskwetsbaarheden

Kijk ook naar: wat zijn de kwetsbaarheden bij direct gebruik van GET en POST?

Het zonder enige validatie ophalen van gegevens van de superglobals $ _GET en $ _POST wordt als een slechte gewoonte beschouwd en biedt methoden voor gebruikers om mogelijk toegang te krijgen tot of een compromis te sluiten via code en SQL-injecties . Ongeldige gegevens moeten worden gecontroleerd en afgewezen om dergelijke aanvallen te voorkomen.

Verzoekgegevens moeten worden ontsnapt, afhankelijk van hoe het in code wordt gebruikt, zoals hier en hier vermeld . In dit antwoord vindt u enkele verschillende escape-functies voor veelvoorkomende gevallen van gegevensgebruik.

Omgaan met fouten bij het uploaden van bestanden

De $_FILES["FILE_NAME"]['error'] (waarbij "FILE_NAME" de waarde is van het kenmerk name van de bestandsinvoer, aanwezig in uw formulier) kan een van de volgende waarden bevatten:

  1. UPLOAD_ERR_OK - Er is geen fout UPLOAD_ERR_OK , het bestand is met succes geüpload.
  2. UPLOAD_ERR_INI_SIZE - Het geüploade bestand overschrijdt de upload_max_filesize-richtlijn in php.ini .
  3. UPLOAD_ERR_PARTIAL - Het geüploade bestand overschrijdt de MAX_FILE_SIZE-richtlijn die is opgegeven in het HTML-formulier.
  4. UPLOAD_ERR_NO_FILE - Er is geen bestand geüpload.
  5. UPLOAD_ERR_NO_TMP_DIR - Er ontbreekt een tijdelijke map. (Van PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE - Kan bestand niet naar schijf schrijven. (Van PHP 5.1.0).
  7. UPLOAD_ERR_EXTENSION - Een PHP-extensie heeft het uploaden van het bestand gestopt. (Van PHP 5.2.0).

Een eenvoudige manier om op fouten te controleren, is als volgt:

<?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-gegevens lezen

Gegevens van een POST-aanvraag worden opgeslagen in de superglobal $_POST in de vorm van een associatieve array.

Houd er rekening mee dat toegang tot een niet-bestaand arrayitem een melding genereert, dus het bestaan moet altijd worden gecontroleerd met de functies isset() of empty() of de operator null coalesce.

Voorbeeld:

$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-gegevens lezen

Gegevens van een GET-verzoek worden opgeslagen in de superglobal $_GET in de vorm van een associatieve array.

Houd er rekening mee dat toegang tot een niet-bestaand arrayitem een melding genereert, dus het bestaan moet altijd worden gecontroleerd met de functies isset() of empty() of de operator null coalesce.

Voorbeeld: (voor 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";

Ruwe POST-gegevens lezen

Gewoonlijk zijn gegevens die in een POST-aanvraag worden verzonden gestructureerde sleutel / waarde-paren met een MIME-type application/x-www-form-urlencoded . Veel toepassingen zoals webservices vereisen echter dat onbewerkte gegevens, vaak in XML- of JSON-indeling, worden verzonden. Deze gegevens kunnen op twee manieren worden gelezen.

php://input is een stream die toegang geeft tot de raw request body.

$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
5.6

$HTTP_RAW_POST_DATA is een globale variabele die de onbewerkte POST-gegevens bevat. Het is alleen beschikbaar als de always_populate_raw_post_data in php.ini is ingeschakeld.

$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);

Deze variabele is verouderd sinds PHP versie 5.6 en is verwijderd in PHP 7.0.

Merk op dat geen van deze methoden beschikbaar is wanneer het inhoudstype is ingesteld op multipart/form-data , die wordt gebruikt voor het uploaden van bestanden.

Bestanden uploaden met HTTP PUT

PHP biedt ondersteuning voor de HTTP PUT-methode die door sommige clients wordt gebruikt om bestanden op een server op te slaan. PUT-aanvragen zijn veel eenvoudiger dan een bestandsupload met POST-aanvragen en ze zien er ongeveer zo uit:

PUT /path/filename.html HTTP/1.1

In uw PHP-code zou u dan zoiets doen:

<?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);
?>

Ook kunt u hier interessante SO-vragen / antwoorden lezen over het ontvangen van een bestand via HTTP PUT.

Arrays doorgeven via POST

Gewoonlijk resulteert een HTML-formulierelement dat bij PHP is ingediend in een enkele waarde. Bijvoorbeeld:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo" value="bar"/>
    <button type="submit">Submit</button>
</form>

Dit resulteert in de volgende uitvoer:

Array
(
    [foo] => bar
)

Er kunnen echter gevallen zijn waarin u een reeks waarden wilt doorgeven. Dit kan worden gedaan door een PHP-achtig achtervoegsel toe te voegen aan de naam van de HTML-elementen:

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

Dit resulteert in de volgende uitvoer:

Array
(
    [foo] => Array
        (
            [0] => bar
            [1] => baz
        )

)

U kunt ook de matrixindexen opgeven als getallen of tekenreeksen:

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

Die retourneert deze uitvoer:

Array
(
    [foo] => Array
        (
            [42] => bar
            [foo] => baz
        )

)

Deze techniek kan worden gebruikt om naverwerking van lussen over de $_POST array te voorkomen, waardoor uw code slanker en beknopter wordt.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow