Obtenez VS. POSTE
- 4114
- 785
- Juliette Paul
Http POSTE 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 dans HTML peuvent utiliser l'une ou l'autre méthode en spécifiant méthode = "post" ou méthode = "get" (par défaut) dans le élément. La méthode spécifiée détermine comment les données de formulaire sont soumises au serveur. Lorsque la méthode est GET, toutes les données de formulaire sont codées dans l'URL, annexées à la action URL comme paramètres de chaîne de requête. Avec la publication, les données du formulaire apparaissent dans le corps du message de la demande HTTP.
Tableau de comparaison
OBTENIR | POSTE | |
---|---|---|
|
| |
Histoire | Les paramètres restent dans l'histoire du navigateur car ils font partie de l'URL | Les paramètres ne sont pas enregistrés dans l'histoire du navigateur. |
En signet | Peut être mis en signet. | Ne peut pas être mis en signet. |
Bouton de retour / Comportement de ré-soumiter | Les demandes de get sont réexécutées mais peuvent ne pas être soumises au serveur si le HTML est stocké dans le cache du navigateur. | Le navigateur alerte généralement l'utilisateur que les données devront être réductrices. |
Type de codage (attribut enctype) | application / x-www-forme-urlencod | multiparte / formulaire de formulaire ou application / x-www-forme-urlencodé Utiliser le codage multipar. |
Paramètres | peut envoyer mais les données des paramètres sont limitées à ce que nous pouvons faire dans la ligne de demande (URL). Le plus sûr pour utiliser moins de 2k de paramètres, certains serveurs gèrent jusqu'à 64k | Peut envoyer des paramètres, y compris le téléchargement de fichiers, sur le serveur. |
Piraté | Plus facile à pirater pour les enfants du script | Plus difficile à pirater |
Restrictions sur le type de données de formulaire | Oui, seuls les caractères ASCII autorisés. | Pas de restrictions. Les données binaires sont également autorisées. |
Sécurité | Obtenir est moins sécurisé par rapport au poste car les données envoyées font partie de l'URL. Il est donc enregistré dans l'historique du navigateur et les journaux des serveurs en texte en clair. | La publication est un peu plus sûre que de l'obtenir car les paramètres ne sont pas stockés dans l'historique du navigateur ou dans les journaux de serveurs Web. |
Restrictions sur la longueur des données du formulaire | Oui, puisque les données de formulaire sont dans l'URL et la longueur de l'URL est limitée. Une limite de longueur d'URL sûre est souvent de 2048 caractères mais varie selon le navigateur et le serveur Web. | Pas de restrictions |
Convivialité | L'obtention de la méthode ne doit pas être utilisée lors de l'envoi de mots de passe ou d'autres informations sensibles. | Méthode postale utilisée lors de l'envoi de mots de passe ou d'autres informations sensibles. |
Visibilité | L'obtention de la méthode est visible pour tout le monde (elle sera affichée dans la barre d'adresse du navigateur) et a des limites à la quantité d'informations à envoyer. | Les variables post-méthode ne sont pas affichées dans l'URL. |
Mis en cache | Peut être mis en cache | Pas mis en cache |
Différences de soumission de formulaire
La différence fondamentale entre Méthode = "get" et Méthode = "post" est-ce qu'ils correspondent à différentes demandes HTTP, comme défini dans les spécifications HTTP. Le processus de soumission pour les deux méthodes commence de la même manière - un ensemble de données de formulaire est construit par le navigateur puis codé d'une manière spécifiée par le cntype attribut. Pour Méthode = "Post le cntype L'attribut peut être multipar / format de forme ou application / x-www-forme-urlencod, alors que pour Méthode = "get", seul application / x-www-forme-urlencod est autorisée. Cet ensemble de données de formulaire est ensuite transmis au serveur.
Pour la soumission de formulaire avec méthode = "get", le navigateur construit une URL en prenant la valeur du action attribut, ajoutant un ? à elle, puis ajoutant le jeu de données de formulaire (encodé à l'aide de l'application / x-www-form-urlencoded Type de contenu). Le navigateur traite ensuite cette URL comme si elle 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 de get avec le reste de l'URL comme argument. Le serveur le prend à partir de là. Notez que ce processus signifie que les données de formulaire sont limitées aux codes ASCII. Des soins particuliers doivent être pris pour encoder et décoder d'autres types de caractères lors de leur passage à travers l'URL au format ASCII.
La soumission d'un formulaire avec méthode = "post" entraîne l'envoi d'une demande de post, en utilisant la valeur du action attribut et un message créé en fonction du type de contenu spécifié par le cntype attribut.
Pour les avantages et les inconvénients
Étant donné que les données de formulaire sont envoyées dans le cadre de l'URL lorsque OBTENIR est utilisé --
- Les données de formulaire sont limitées aux codes ASCII. Des soins particuliers doivent être pris pour encoder et décoder d'autres types de caractères lors de leur passage à travers l'URL au format ASCII. D'un autre côté, les données binaires, les images et autres fichiers peuvent tous être soumis via Méthode = "post"
- Toutes les données de formulaire remplies sont visibles dans l'URL. De plus, il est également stocké dans l'historique / journaux de la navigation Web de l'utilisateur pour le navigateur. Ces problèmes font OBTENIR Moins sécurisé.
- Cependant, un avantage des données de formulaire envoyées dans le cadre de l'URL est que l'on peut mettre les URL en signet et les utiliser directement et contourner complètement le processus de remplissage de formulaire.
- Il y a une limitation à la quantité de données de formulaire peut être envoyée car les longueurs d'URL sont limitées.
- Script Kiddies peut plus facilement exposer les vulnérabilités du système pour le pirater. Par exemple, Citibank a été piraté en modifiant les numéros de compte dans la chaîne d'URL.[1] Bien sûr, les pirates expérimentés ou les développeurs Web peuvent exposer de telles vulnérabilités même si la publication est utilisée; C'est juste un peu plus difficile. En général, le serveur doit se méfier de toutes les données envoyées par le client et se protéger contre les références d'objets directs non sécurisés.
Différences de traitement côté serveur
En principe, le traitement des données de formulaire soumis dépend de savoir s'il est envoyé avec Méthode = "get" ou Méthode = "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 général, le changement de la méthode 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 d'une variable d'environnement (QueryString) lorsque OBTENIR est utilisé. Mais quand POSTE est utilisé, les données de formulaire sont passées dans le flux d'entrée standard (stdin) et le nombre d'octets à lire est donné par l'en-tête de longueur de contenu.
Que se passe-t-il en cas de conflit Get et Post Variables?
Dans certaines langues telles que PHP, les informations de Get et Post Paramètres, en plus d'être disponibles séparément, sont également combinées en une variable de commodité E.g., $ _Request en php. S'il y a un conflit - i.e., Le même nom de paramètre est utilisé avec différentes valeurs dans Get et après le conflit est résolu avec certaines règles. Dans le cas de PHP, la priorité est décidée par le variables_order directive de configuration. L'ordre par défaut est EGPCS (environnement, get, post, cookie, serveur). Cela signifie que la variable de $ _get obtient une priorité sur $ _POST, ce qui à son tour est prioritaire sur $ _cookie.
Utilisation recommandée
GET est recommandé lors de la soumission des formulaires "idempotents" - ceux qui ne modifient pas de manière significative l'état du monde ". En d'autres termes, les formes qui impliquent uniquement les requêtes de base de données. Une autre perspective est que plusieurs requêtes idempotentes auront le même effet qu'une seule requête. Si des mises à jour de la base de données ou d'autres actions telles que les e-mails déclenchants sont impliqués, l'utilisation de la publication est recommandée.
Du blog Dropbox Developer:
Un navigateur ne sait pas exactement ce que fait un formulaire HTML particulier, mais si le formulaire est soumis via HTTP Get, le navigateur sait qu'il est sûr de réessayer automatiquement la soumission en cas d'erreur de réseau. Pour les formulaires qui utilisent HTTP Post, il peut ne pas être sûr de réessayer, le navigateur demande d'abord à l'utilisateur de l'utilisateur.
Une demande "Get" est souvent cachable, tandis qu'une demande "post" peut difficilement être. Pour les systèmes de requête, cela peut avoir un impact sur l'efficacité considérable, surtout si les chaînes de requête sont simples, car les caches peuvent servir les requêtes les plus fréquentes.
Dans certains cas, en utilisant POSTE est recommandé même pour les requêtes idempotentes:
- Si les données de formulaire contiendraient des caractères non ASCII (comme les caractères accentués), alors Méthode = "get" est inapplicable en principe, bien qu'il puisse fonctionner dans la pratique (principalement pour les caractères ISO Latin 1).
- Si l'ensemble de données de formulaire est grand - Dis, des centaines de personnages - alors Méthode = "get" peut causer des problèmes pratiques avec les implémentations qui ne peuvent pas gérer ces longues URL.
- Vous voudrez peut-être éviter Méthode = "get" Afin de le rendre moins visible pour les utilisateurs comment fonctionne le formulaire, en particulier afin de rendre les champs "cachés" (Type d'entrée = "caché") plus cachés en n'apparaissant pas dans l'URL. Mais même si vous utilisez des champs cachés avec Méthode = "post", Ils apparaîtront toujours dans le code source HTML.
Qu'en est-il de https?
Mis à jour le 15 mai 2015: spécifiquement lors de l'utilisation de HTTPS (HTTP sur TLS / SSL), le poste offre plus de sécurité que d'obtenir?
C'est une question intéressante. Dites que vous faites une demande de GET à une page Web:
Obtenez https: // www.exemple.com / connexion.php?user = Mickey & Passwd = mini
En supposant que votre connexion Internet est surveillée, quelles informations sur cette demande seront disponibles pour le Snoooper? Si la publication est utilisée à la place et que les données utilisateur et PASSWD sont incluses dans les variables de post, cela sera plus sécurisé dans le cas des connexions HTTPS?
La réponse est non. Si vous faites une telle demande de GET, seules les informations suivantes seront connues de l'attaquant qui surveillera votre trafic Web:
- Le fait que vous ayez établi une connexion HTTPS
- Le nom d'hôte - www.exemple.com
- La durée totale de la demande
- La longueur de la réponse
La partie de chemin de l'URL - i.e., La page réelle demandée, ainsi que les paramètres de chaîne de requête - sont protégées (cryptées) alors qu'elles sont "sur le fil" i.e., en transit sur leur chemin vers le serveur de destination. La situation est exactement la même pour les demandes de poste.
Le POSTE La méthode conserve toujours un avantage même dans le cas de HTTPS, cependant. Les serveurs Web ont tendance à enregistrer toute l'URL demandée en texte brut dans leurs journaux d'accès; Donc, envoyer des informations sensibles sur Get n'est pas une bonne idée. Cela s'applique que HTTP ou HTTPS soit utilisé.