PHP
Lecture des données de demande
Recherche…
Remarques
Choisir entre GET et POST
Les requêtes GET sont les meilleures pour fournir les données nécessaires au rendu de la page et peuvent être utilisées plusieurs fois (requêtes de recherche, filtres de données ...). Ils font partie de l'URL, ce qui signifie qu'ils peuvent être mis en signet et sont souvent réutilisés.
Les requêtes POST , quant à elles, sont destinées à soumettre des données au serveur une seule fois (formulaires de contact, formulaires de connexion…). Contrairement à GET, qui accepte uniquement les fichiers ASCII, les requêtes POST autorisent également les données binaires, y compris les téléchargements de fichiers .
Vous pouvez trouver une explication plus détaillée de leurs différences ici .
Vulnérabilités de demande de données
Regardez également: quelles sont les vulnérabilités dans l'utilisation directe de GET et POST?
La récupération des données des superglobales $ _GET et $ _POST sans aucune validation est considérée comme une mauvaise pratique et ouvre des méthodes permettant aux utilisateurs d'accéder aux données ou de les compromettre via des injections de code et / ou SQL . Les données non valides doivent être vérifiées et rejetées afin d'éviter de telles attaques.
Les données de demande doivent être échappées en fonction de leur utilisation dans le code, comme indiqué ici et ici . Vous trouverez dans cette réponse quelques fonctions d'échappement différentes pour les cas d'utilisation courants de données.
Gestion des erreurs de téléchargement de fichiers
$_FILES["FILE_NAME"]['error']
(où "FILE_NAME"
est la valeur de l'attribut name de l'entrée du fichier, présent dans votre formulaire) peut contenir l'une des valeurs suivantes:
-
UPLOAD_ERR_OK
- Il n'y a pas d'erreur, le fichier a été téléchargé avec succès. -
UPLOAD_ERR_INI_SIZE
- Le fichier téléchargé dépasse la directive upload_max_filesize dansphp.ini
. -
UPLOAD_ERR_PARTIAL
- Le fichier téléchargé dépasse la directive MAX_FILE_SIZE spécifiée dans le formulaire HTML. -
UPLOAD_ERR_NO_FILE
- Aucun fichier n'a été téléchargé. -
UPLOAD_ERR_NO_TMP_DIR
- Un dossier temporaire est manquant. (À partir de PHP 5.0.3). -
UPLOAD_ERR_CANT_WRITE
- Impossible d'écrire le fichier sur le disque. (À partir de PHP 5.1.0). -
UPLOAD_ERR_EXTENSION
- Une extension PHP a arrêté le téléchargement du fichier. (À partir de PHP 5.2.0).
Un moyen de base pour vérifier les erreurs est le suivant:
<?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;
}
Lecture des données POST
Les données d'une requête POST sont stockées dans le superglobal $_POST
sous la forme d'un tableau associatif.
Notez que l'accès à un élément de tableau inexistant génère une notification, donc l'existence doit toujours être vérifiée avec les fonctions isset()
ou empty()
, ou l'opérateur null coalesce.
Exemple:
$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";
Lecture des données GET
Les données d'une requête GET sont stockées dans le superglobal $_GET
sous la forme d'un tableau associatif.
Notez que l'accès à un élément de tableau inexistant génère une notification, donc l'existence doit toujours être vérifiée avec les fonctions isset()
ou empty()
, ou l'opérateur null coalesce.
Exemple: (pour l'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";
Lecture des données POST brutes
Habituellement, les données envoyées dans une requête POST sont des paires clé / valeur structurées avec un type d' application/x-www-form-urlencoded
MIME application/x-www-form-urlencoded
. Cependant, de nombreuses applications, telles que les services Web, nécessitent l'envoi de données brutes, souvent au format XML ou JSON. Ces données peuvent être lues en utilisant l'une des deux méthodes.
php://input
est un flux qui donne accès au corps de la requête brute.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
est une variable globale contenant les données POST brutes. Il n'est disponible que si la directive always_populate_raw_post_data
de php.ini
est activée.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
Cette variable est obsolète depuis la version PHP 5.6 et a été supprimée dans PHP 7.0.
Notez qu'aucune de ces méthodes n'est disponible lorsque le type de contenu est défini sur multipart/form-data
, qui est utilisé pour les téléchargements de fichiers.
Téléchargement de fichiers avec HTTP PUT
PHP prend en charge la méthode HTTP PUT utilisée par certains clients pour stocker des fichiers sur un serveur. Les requêtes PUT sont beaucoup plus simples qu'un téléchargement de fichier à l'aide de requêtes POST et ressemblent à ceci:
PUT /path/filename.html HTTP/1.1
Dans votre code PHP, vous feriez alors quelque chose comme ceci:
<?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);
?>
Ici aussi , vous pouvez lire des questions / réponses intéressantes sur la réception de fichiers via HTTP PUT.
Passerelles par POST
Généralement, un élément de formulaire HTML soumis à PHP génère une valeur unique. Par exemple:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
Cela se traduit par la sortie suivante:
Array
(
[foo] => bar
)
Cependant, il peut arriver que vous souhaitiez transmettre un tableau de valeurs. Cela peut être fait en ajoutant un suffixe de type PHP au nom des éléments HTML:
<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>
Cela se traduit par la sortie suivante:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
Vous pouvez également spécifier les indices du tableau, sous forme de nombres ou de chaînes:
<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>
Qui renvoie cette sortie:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
Cette technique peut être utilisée pour éviter les boucles de post-traitement sur le tableau $_POST
, rendant votre code plus léger et plus concis.