HTTP POSTER les demandes fournissent des données supplémentaires du client (navigateur) au serveur dans le corps du message. En revanche, OBTENIR les demandes incluent toutes les données requises dans l'URL. Les formulaires HTML peuvent utiliser l’une ou l’autre des méthodes en spécifiant method = "POST" ou method = "GET" (par défaut) dans le élément. La méthode spécifiée détermine le mode de soumission des données de formulaire au serveur. Lorsque la méthode est GET, toutes les données de formulaire sont codées dans l’URL, ajoutées au fichier. action URL en tant que paramètres de chaîne de requête. Avec POST, les données de formulaire apparaissent dans le corps du message de la requête HTTP..
OBTENIR | POSTER | |
---|---|---|
L'histoire | Les paramètres restent dans l'historique du navigateur car ils font partie de l'URL | Les paramètres ne sont pas enregistrés dans l'historique du navigateur.. |
Favoris | Peut être marqué. | Ne peut être marqué. |
Bouton Retour / comportement de re-soumission | Les requêtes GET sont ré-exécutées mais ne peuvent pas être soumises au serveur si le code HTML est stocké dans la mémoire cache du navigateur.. | Le navigateur prévient généralement l'utilisateur que les données devront être soumises à nouveau.. |
Type de codage (attribut enctype) | application / x-www-form-urlencoded | multipart / form-data ou application / x-www-form-urlencoded Utilisez le codage en plusieurs parties pour les données binaires. |
Paramètres | peut envoyer mais les données de paramètre sont limitées à ce que nous pouvons fourrer dans la ligne de requête (URL). Plus sûr d'utiliser moins de 2 Ko de paramètres, certains serveurs traitent jusqu'à 64 Ko | Peut envoyer des paramètres, y compris le téléchargement de fichiers, au serveur. |
Piraté | Plus facile à pirater pour les script kiddies | Plus difficile à pirater |
Restrictions sur le type de données de formulaire | Oui, seuls les caractères ASCII sont autorisés. | Pas de restrictions. Les données binaires sont également autorisées. |
Sécurité | GET est moins sécurisé que POST car les données envoyées font partie de l'URL. Donc, il est enregistré dans l'historique du navigateur et les journaux du serveur en texte brut. | Le POST est un peu plus sûr que GET car les paramètres ne sont pas stockés dans l'historique du navigateur ou dans les journaux du serveur Web.. |
Restrictions sur la longueur des données de formulaire | Oui, puisque les données de formulaire sont dans l'URL et que la longueur de l'URL est limitée. La longueur maximale d'une URL sécurisée est souvent de 2 048 caractères, mais elle varie selon le navigateur et le serveur Web.. | Pas de restrictions |
Utilisabilité | La méthode GET ne doit pas être utilisée lors de l'envoi de mots de passe ou d'autres informations sensibles. | Méthode POST utilisée lors de l'envoi de mots de passe ou d'autres informations sensibles. |
Visibilité | La méthode GET est visible par tout le monde (elle sera affichée dans la barre d'adresse du navigateur) et limite la quantité d'informations à envoyer.. | Les variables de méthode POST ne sont pas affichées dans l'URL. |
Mis en cache | Peut être mis en cache | Non mis en cache |
La différence fondamentale entre METHOD = "GET" et METHOD = "POST" est-ce qu'ils correspondent à différentes requêtes HTTP, tel que défini dans les spécifications HTTP. Le processus de soumission des deux méthodes commence de la même manière: un ensemble de données de formulaire est construit par le navigateur, puis codé de la manière spécifiée par le navigateur. enctype attribut. Pour METHOD = "POST la enctype attribut peut être multipart / form-data ou application / x-www-form-urlencoded, alors que pour METHOD = "GET", seulement application / x-www-form-urlencoded est autorisée. Cet ensemble de données de formulaire est ensuite transmis au serveur..
Pour la soumission de formulaire avec METHOD = "GET", le navigateur construit une URL en prenant la valeur de action attribut, ajout d'un ? puis ajoutez le jeu de données de formulaire (codé à l'aide du type de contenu application / x-www-form-urlencoded). Le navigateur traite ensuite cette URL comme s’il suivait un lien (ou comme si l’utilisateur avait tapé l’URL directement). Le navigateur divise l'URL en parties et reconnaît un hôte, puis envoie à cet hôte une demande GET avec le reste de l'URL en tant qu'argument. Le serveur prend à partir de là. Notez que ce processus signifie que les données de formulaire sont limitées aux codes ASCII. Un soin particulier doit être apporté à l'encodage et au décodage des autres types de caractères lors de leur passage à travers l'URL au format ASCII.
La soumission d’un formulaire avec METHOD = "POST" entraîne l’envoi d’une requête POST à l’aide de la valeur de action attribut et un message créé en fonction du type de contenu spécifié par le enctype attribut.
Les données de formulaire étant envoyées avec l’URL lorsque OBTENIR est utilisé --
En principe, le traitement des données de formulaire soumises dépend du fait qu’elles sont envoyées avec METHOD = "GET" ou METHOD = "POST". Étant donné que les données sont codées de différentes manières, différents mécanismes de décodage sont nécessaires. Ainsi, en règle générale, le changement de METHOD peut nécessiter un changement dans le script qui traite la soumission. Par exemple, lors de l’utilisation de l’interface CGI, le script reçoit les données dans une variable d’environnement (QUERYSTRING) lorsque OBTENIR est utilisé. Mais quand POSTER est utilisé, les données de formulaire sont transmises dans le flux d’entrée standard (stdin) et le nombre d'octets à lire est donné par l'en-tête Content-length.
GET est recommandé lors de la soumission de formulaires "idempotents", c'est-à-dire ceux qui ne "modifient pas de manière significative l'état du monde". En d'autres termes, les formulaires qui impliquent uniquement des requêtes de base de données. Une autre perspective est que plusieurs requêtes idempotentes auront le même effet qu'une requête unique. Si des mises à jour de la base de données ou d'autres actions telles que le déclenchement d'e-mails sont impliquées, l'utilisation de POST est recommandée..
Sur le blog des développeurs Dropbox:
un navigateur ne sait pas exactement ce que fait un formulaire HTML particulier, mais si le formulaire est soumis via HTTP GET, il sait qu'il est prudent de réessayer automatiquement de le soumettre en cas d'erreur réseau. Pour les formulaires qui utilisent HTTP POST, il peut s'avérer dangereux de réessayer. Le navigateur demande d'abord à l'utilisateur de confirmer.
Une requête "GET" peut souvent être mise en mémoire cache, alors qu'une requête "POST" peut difficilement l'être. Pour les systèmes de requête, cela peut avoir un impact considérable sur l'efficacité, en particulier si les chaînes de requête sont simples, car les caches peuvent servir aux requêtes les plus fréquentes..
Dans certains cas, en utilisant POSTER est recommandé même pour les requêtes idempotentes:
Mis à jour le 15 mai 2015: spécifiquement avec HTTPS (HTTP sur TLS / SSL), le POST offre-t-il plus de sécurité que GET??
C'est une question intéressante. Supposons que vous adressiez une demande GET à une page Web:
OBTENIR https://www.example.com/login.php?user=mickey&passwd=mini
En supposant que votre connexion Internet soit surveillée, quelles informations sur cette demande seront disponibles pour le snooper? Si POST est utilisé à la place et que les données utilisateur et mot de passe sont incluses dans les variables POST, est-ce que cela sera plus sécurisé dans le cas de connexions HTTPS??
La réponse est non. Si vous faites une telle requête GET, l'attaquant surveillant votre trafic Web ne connaîtra que les informations suivantes:
La partie chemin de l’URL - c’est-à-dire la page réelle demandée, ainsi que les paramètres de chaîne de requête - est protégée (chiffrée) tant qu’elle est "sur le fil", c’est-à-dire en transit vers le serveur de destination. La situation est exactement la même pour les demandes POST.
Bien entendu, les serveurs Web ont tendance à consigner l’URL complète en texte brut dans leurs journaux d’accès; Il est donc déconseillé d’envoyer des informations sensibles via GET. Ceci s'applique indépendamment du fait que HTTP ou HTTPS soit utilisé.