Est-ce une bonne pratique d'utiliser une URL vide pour l'attribut d'action d'un formulaire HTML? (action = "")

279

Je me demande si quelqu'un peut donner une réponse aux "meilleures pratiques" en utilisant des actions de formulaire HTML vierges pour publier sur la page actuelle.

Il y a un message demandant ce que fait une action de formulaire HTML vierge ici et certaines pages comme celle-ci suggèrent que c'est bien, mais j'aimerais savoir ce que les gens pensent.

Matt Mitchell
la source
7
Suggérant que la balise "meilleures pratiques" soit appliquée à cela.
Will Morgan
Pour confirmer doublement, laissez l'action vide, ou ne mentionnez simplement aucune action (comme <form name="xyz" >). Il soumettra l'action de son propre chef.
lwpro2
11
Le fait de ne pas inclure l'attribut action ouvre la page aux attaques de détournement de clics iframe , telles que celles dans lesquelles un attaquant enveloppe votre page dans un iframe et l'URL iframe comprend un paramètre de requête portant le même nom qu'un champ de formulaire. Lorsque le formulaire est soumis, la valeur de la requête est insérée dans la base de données, de sorte que les informations d'identification de l'utilisateur (e-mail, adresse, etc.) ont été compromises.
Paul Sweatte
Alors, quel est le moyen valide et sécurisé de soumettre un formulaire à la page actuelle?
Costa

Réponses:

268

La meilleure chose que vous puissiez faire est de supprimer complètement l'attribut action. Si vous l'omettez, le formulaire sera envoyé à l'adresse du document, c'est-à-dire la même page.

Il est également possible de le laisser vide, et tout navigateur implémentant l'algorithme de soumission de formulaire HTML le traitera comme équivalent à l'adresse du document, ce qu'il fait principalement parce que c'est ainsi que les navigateurs fonctionnent actuellement:

8.Soit action l'action de l'élément émetteur .

9.Si action est la chaîne vide, laissez action être l'adresse du document .

Remarque: Cette étape est une violation délibérée de la RFC 3986, qui nécessiterait ici un traitement d'URL de base. Cette violation est motivée par un désir de compatibilité avec le contenu hérité. [RFC3986]

Cela fonctionne certainement dans tous les navigateurs actuels, mais peut ne pas fonctionner comme prévu dans certains navigateurs plus anciens ( "les navigateurs font des choses étranges avec une action vide =" "attribut " ), c'est pourquoi la spécification décourage fortement les auteurs de la laisser vide :

Les attributs de contenu actionet formaction, s'ils sont spécifiés, doivent avoir une valeur qui est une URL non vide valide potentiellement entourée d'espaces .

mercator
la source
12
Cela a peut-être changé depuis votre réponse (cela fait presque trois ans), mais à ce jour, HTML5 ne permet pas action=""- voir ma réponse ...
derobert
2
@derobert Merci. Cela n'avait probablement pas changé. J'ai changé ma réponse pour mieux refléter ce que dit la spécification.
mercator
73

En fait, la sous - section Soumission de formulaire du brouillon HTML5 actuel ne le permet pas action="". C'est contre la spécification.

Les attributs de contenu actionet formaction, s'ils sont spécifiés, doivent avoir une valeur qui est une URL non vide valide potentiellement entourée d'espaces. (pas d'italique dans l'original)

La section citée dans la réponse de Mercator est une exigence sur les implémentations , pas sur les auteurs . Les auteurs doivent suivre les exigences des auteurs. Pour citer Comment lire cette spécification :

En particulier, il existe des exigences de conformité qui s'appliquent aux producteurs, par exemple les auteurs et les documents qu'ils créent, et il existe des exigences de conformité qui s'appliquent aux consommateurs, par exemple les navigateurs Web. Ils peuvent être distingués par ce qu'ils exigent: une exigence imposée à un producteur indique ce qui est autorisé, tandis qu'une exigence imposée à un consommateur indique comment un logiciel doit agir.

Le changement par rapport à HTML4 - qui autorisait une URL vide - a été effectué parce que «les navigateurs font des choses étranges avec un action=""attribut vide ». Compte tenu de la raison du changement, il est probablement préférable de ne pas le faire en HTML4 non plus.

derobert
la source
Cela permet-il l'absence totale de l' actionattribut pour indiquer que le formulaire doit être soumis à l'adresse du document? Il semble, car il dit, "si spécifié."
Kerrick
2
@Kerrick Oui, je crois que HTML5 permet d'omettre entièrement l'attribut action et le définit par défaut sur une chaîne vide. HTML4 ne l'a pas fait, il spécifie l'action requise.
derobert
Je suis d'accord avec @Kerrick, il est permis d'omettre l'attribut action. En lisant le projet HTML5 actuel, il semble que la chaîne vide ne soit pas autorisée mais l'absence de l'attribut est autorisée. Mais dans tous les cas, pour des raisons de compatibilité, je vous recommande de toujours inclure l'attribut "action" et de le remplir avec une URL non vide valide (les bonnes pratiques sont toujours le meilleur moyen).
serfer2
Un problème potentiel: AngularJS empêchera la soumission de formulaires sans attribut d'action. Ce n'est probablement pas un problème commun, mais il m'a fallu un certain temps pour comprendre pourquoi certaines parties de notre site hérité ont commencé à se casser.
Asmor
18

Ne pas inclure l'attribut action ouvre la page aux attaques de détournement de clics iframe , qui impliquent quelques étapes simples:

  • Un attaquant enveloppe votre page dans un iframe
  • L'URL iframe comprend un paramètre de requête portant le même nom qu'un champ de formulaire
  • Lorsque le formulaire est soumis, la valeur de la requête est insérée dans la base de données
  • Les informations d'identification de l'utilisateur (e-mail, adresse, etc.) ont été compromises

Références

Paul Sweatte
la source
2
L'URL iframe ne contient-elle pas de paramètres GET, alors que les formulaires sont généralement soumis à l'aide de POST? Donc, si le site ne traite que des paramètres POST, cela ne devrait pas poser de problème, n'est-ce pas? Au moins, j'utilise généralement le tableau $ _POST en PHP uniquement lors du traitement des formulaires.
Calmarius
2
@Calmarius Oui, utilisez $_POSTau lieu de $_REQUESTpour éviter cela. Si le code cadre utilise $_REQUEST, utilisez un buster iframe .
Paul Sweatte
17

Cela sera validé avec HTML5.

<form action="#">

la source
4
Je ne l'ai pas essayé, mais conceptuellement, cela ne défilerait-il pas en haut de la page après la soumission?
Matt Mitchell
2
Tu ne pourrais pas utiliser action="."?
s427
3
action = "?" fonctionne bien aussi. Il valide et pointe vers la page actuelle sans et interroge les données de chaîne.
Chris Broski
5
action="."est une mauvaise idée pour le cas général. Une URL comme example.com/loginest mappée simplement example.com/.
Torsten Bronger
1
Cette réponse n'est valable que si l'utilisateur souhaite faire défiler vers le haut de la page.
Buts du
9

EN HTML 5 action=""N'EST PAS PRIS EN CHARGE, DONC NE LE FAITES PAS. MAUVAISE PRATIQUE.

Si au lieu de cela vous annulez complètement l'action, elle se soumettra à la même page par défaut, je pense que c'est la meilleure pratique:

<form>This will submit to the current page</form>

Si vous rédigez le formulaire en utilisant php, vous pouvez envisager les points suivants. en savoir plus ici.

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

Vous pouvez également utiliser #garder à l'esprit que cela agira comme une ancre et défilera vers le haut de la page.

<form action="#">
Buts
la source
Aimeriez-vous comprendre pourquoi quelqu'un a voté contre cette réponse?
Buts
Vous omettez l'attribut action, le formulaire est-il toujours ouvert aux exploits détaillés sur la première page du lien?
Richard Young
@RichardYoung Désolé, je ne comprends pas votre question. Veuillez reformuler.
Buts
1
La variable $ _SERVER ["PHP_SELF"] peut être utilisée par les pirates. Si PHP_SELF est utilisé dans votre page, un utilisateur peut entrer une barre oblique (/) puis quelques commandes Cross Site Scripting (XSS) à exécuter. Si vous omettez l'attribut action, êtes-vous toujours vulnérable à cela?
Richard Young
Oui, vous l'êtes. L'attribut action peut être ajouté de nouveau côté client et donné n'importe quelle valeur de choix. Cependant, l'utilisation de la htmlspecialchars()fonction empêche les gens d'utiliser le script php contre vous.
Buts
4

J'utilise normalement action = "", qui est valide en XHTML et conserve les données GET dans l'URL.

Juddling
la source
4
Rarement, mais par exemple, dans mon forum, j'aurais l'URL: thread.php? Id = 12 & page = 6 et il y a un formulaire POST au bas de la page pour ajouter des commentaires, et j'ai besoin des données GET donc le PHP sait à quel thread ajouter le commentaire.
Juddling
20
GET est la méthode par défaut pour les formulaires - ce n'est vraiment
NickFitz
5
L'utilisation de GET dans les formulaires est une mauvaise chose. Si l'utilisateur recharge la page après la soumission, il peut y avoir des conséquences inattendues. Cependant, si un POST est utilisé, le navigateur vous avertira de la nouvelle soumission des mêmes données.
Will Sheppard
22
@ WillSheppard, je ne suis pas d'accord. Vous ne pouvez pas faire une déclaration générale comme ça. Tout dépend de ce que fait le formulaire. Vous devez utiliser POST pour tout ce qui exécute une action (par exemple, insérer un nouveau message dans un forum), mais GET pour tout le reste (par exemple, un champ de recherche ou utiliser des formulaires pour la navigation). Après un POST réussi, le script doit rediriger le navigateur pour empêcher l'utilisateur de soumettre à nouveau les données.
Mike
3
PS: tous les navigateurs n'informent pas l'utilisateur de la nouvelle soumission des données POST (par exemple Opera)
Mike
4

Je pense qu'il est préférable d' indiquer explicitement où le formulaire est publié. Si vous voulez être totalement sûr, entrez la même URL que le formulaire se trouve dans l'attribut action si vous voulez qu'il se soumette à lui-même. Bien que les navigateurs traditionnels soient évalués ""sur la même page, vous ne pouvez pas garantir que les navigateurs non traditionnels le seront.

Et bien sûr, l'URL entière, y compris les données GET comme Juddling, le souligne.

Will Morgan
la source
2

Utilisez simplement

?

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

Il ne viole pas les normes HTML5.

M_R_K
la source
Je n'ai pas downvote, mais votre méthode supprimera tous les getparamètres. Un formulaire sur l'URL suivante se briserait example.com/update_user?user_id=1car le formulaire sera soumis àexample.com/update_user?
vikki
1

J'avais l'habitude de faire beaucoup de choses quand je travaillais avec Classic ASP. Habituellement, je l'ai utilisé lorsque la validation côté serveur était nécessaire pour l'entrée (avant l'époque d'AJAX). Le principal inconvénient que je vois est qu'il ne sépare pas la logique de programmation de la présentation, au niveau du fichier.

busse
la source
1
pourquoi pas? Je pense que ce n'est pas connecté. Je peux demander à un formulaire de publier les données sur la même page et de créer cette page avec une séparation appropriée du contrôleur et de la vue.
markus
1

J'utilise pour ne pas spécifier du tout d'attribut d'action. C'est en fait la façon dont mon framework est conçu, toutes les pages sont renvoyées exactement à la même adresse. Mais aujourd'hui, j'ai découvert un problème. Parfois, j'emprunte une valeur d'attribut d'action pour effectuer un appel en arrière-plan (je suppose que certaines personnes les appellent AJAX). J'ai donc trouvé qu'IE conserve la valeur de l'attribut d'action vide si l'attribut d'action n'était pas spécifié. C'est un peu étrange à ma connaissance, car si aucun attribut d'action n'est spécifié, l'homologue JavaScript doit être au moins indéfini. Quoi qu'il en soit, mon point est avant de choisir la meilleure pratique, vous devez comprendre plus de contexte, comme allez-vous utiliser l'attribut en JavaScript ou non.

Singagirl
la source