la soumission d'un formulaire GET avec les paramètres de chaîne de requête et les paramètres masqués disparaît

231

Considérez ce formulaire:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

Lors de la soumission de ce formulaire (un formulaire GET), les paramètres a et b disparaissent. Y at-il une raison à cela? Existe-t-il un moyen d'éviter ce comportement?

Kiquenet
la source
3
Votre élément d'action est mal formé.
Adrian Godong
Ils ne devraient pas disparaître, donc je pense que nous devrons voir votre formulaire.
UnkwnTech
2
Salut, Voici le formulaire complet, vous pouvez simplement créer un HTML avec ce formulaire et voir que les paramètres que je passe dans l'action disparaissent: <form action = " example.com?e=4&f=5 " method = "GET"> <input type = "hidden" name = "a" value = "1" /> <input type = "hidden" name = "b" value = "2" /> <input type = "hidden" name = "c" value = "3" /> <input type = "submit" /> </form>
1
Au fait, vous savez que vous manquez un devis final sur cette valeur d'action? Totalement à part le problème principal, mais ...
Jay
J'ai posté une solution de contournement possible en utilisant JavaScript ici: stackoverflow.com/questions/3548795/…
Jenny O'Reilly

Réponses:

263

N'est-ce pas à cela que servent les paramètres cachés pour commencer ...?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

Je ne compterais sur aucun navigateur conservant une chaîne de requête existante dans l'URL de l'action.

Comme le précisent les spécifications ( RFC1866 , page 46; section HTML 4.x 17.13.3):

Si la méthode est "get" et que l'action est un URI HTTP, l'agent utilisateur prend la valeur de l'action, ajoute un "?" à lui, puis ajoute l'ensemble de données de formulaire, codé en utilisant le type de contenu "application / x-www-form-urlencoded".

Peut-être que l'on pourrait encoder l'URL d'action pour cent pour intégrer le point d'interrogation et les paramètres, puis croiser les doigts pour espérer que tous les navigateurs laisseront cette URL telle qu'elle (et validera que le serveur la comprend aussi). Mais je ne compterais jamais là-dessus.

Soit dit en passant: ce n'est pas différent pour les champs de formulaire non masqués. Pour POST, l'URL de l'action peut contenir une chaîne de requête.

Arjan
la source
71

En HTML5, il s'agit d'un comportement par spécification.

Voir http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

Regardez "4.10.22.3 Algorithme de soumission de formulaire", étape 17. Dans le cas d'un formulaire GET vers un URI http / s avec une chaîne de requête:

Soit destination une nouvelle URL qui est égale à l'action, sauf que son <query>composant est remplacé par une requête (en ajoutant un caractère U + 003F QUESTION MARK (?) Si approprié).

Ainsi, votre navigateur supprimera la partie "? ..." existante de votre URI et la remplacera par une nouvelle basée sur votre formulaire.

Dans HTML 4.01, la spécification produit des URI invalides - la plupart des navigateurs ne l'ont pas fait cependant.

Voir http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , étape quatre - l'URI aura un? ajouté, même s'il en contient déjà un.

xyphoïde
la source
cela signifie: tout ce qui se trouve derrière l' ?URL d'action est supprimé? Alors, quel est, si le paramètre GET dans l'url d'action contient la cible, où le formulaire doit être traité? comme: action="index.php?site=search". Je ne suis pas sûr, si mettre le paramètre GET dans des champs de saisie cachés est une idée divine.
Le Bndr
qu'entendez-vous par spécification @xyphoid?
AmiNadimi
@AmiNadimi: Cela signifie "conformément aux spécifications".
récursif
14

Ce que vous pouvez faire est d'utiliser un simple foreach sur la table contenant les informations GET. Par exemple en php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}
Efx
la source
23
Remarque: n'utilisez jamais cet exemple de code exactement comme écrit. Ce serait très dangereux. Les valeurs de GET proviennent de l'utilisateur, ne doivent donc pas être écrites sur la page sans les avoir échappées au préalable.
drewm
16
Downvoting jusqu'à ce que le bogue XSS dans ce code soit corrigé.
spookylukey
1
Cette réponse fournit une solution similaire mais non adaptable à XSS.
vvzh
cela ne gère pas les paramètres du tableau
Andrew
5

Vous devez inclure les deux éléments (a et b) comme éléments d'entrée masqués ainsi que C.

Bernhard Hofmann
la source
Oui, bien sûr, je le ferais si possible. Mais disons que j'ai des paramètres dans la chaîne de requête et dans les entrées cachées, que puis-je faire?
Je pense que votre seule option est d'analyser les paires nom / valeur de la chaîne de requête et de produire des champs de saisie masqués. Peut-être que si vous décrivez un peu plus le contexte de la page et de l'URL, nous pourrons peut-être suggérer une solution de travail.
Bernhard Hofmann
Vous pouvez également extraire les données des éléments de formulaire masqués et les ajouter à l'URL et aux paramètres de requête supplémentaires, puis remplacer le bouton d'envoi du formulaire par un lien d'ancrage simple ou une Location:redirection de serveur si vous ne souhaitez aucune interaction avec l'utilisateur final. .
Jason
1

J'ai eu un problème très similaire où pour l'action de formulaire, j'avais quelque chose comme:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

Le bouton amènerait l'utilisateur au site, mais les informations de la requête ont disparu, de sorte que l'utilisateur a atterri sur la page d'accueil plutôt que sur la page de contenu souhaitée. La solution dans mon cas était de savoir comment coder l'URL sans la requête qui amènerait l'utilisateur à la page souhaitée. Dans ce cas, ma cible était un site Drupal, donc il s'est avéré /content/somethingégalement fonctionner. J'aurais aussi pu utiliser un numéro de noeud (ie /node/123).

KillerRabbit
la source
0

Si vous avez besoin d'une solution de contournement, car ce formulaire peut être placé dans des systèmes tiers, vous pouvez utiliser Apache mod_rewrite comme ceci:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

alors votre nouveau formulaire ressemblera à ceci:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

et Apache ajoutera le 3e paramètre à la requête

wanis
la source
-3

Votre construction est illégale. Vous ne pouvez pas inclure de paramètres dans la valeur d'action d'un formulaire. Que se passe-t-il si vous essayez cela dépendra des caprices du navigateur. Je ne serais pas surpris si cela fonctionnait avec un navigateur et pas avec un autre. Même si cela semblait fonctionner, je ne m'y fierais pas, car la prochaine version du navigateur pourrait changer le comportement.

"Mais disons que j'ai des paramètres dans la chaîne de requête et dans les entrées cachées, que puis-je faire?" Ce que vous pouvez faire, c'est corriger l'erreur. Pour ne pas être sournois, mais cela revient un peu à demander: «Mais disons que mon URL utilise des signes de pourcentage au lieu de barres obliques, que puis-je faire? La seule réponse possible est que vous pouvez corriger l'URL.

Geai
la source
Toute cette réponse est techniquement correcte ("c'est faux, alors corrigez-la") mais d'aucune utilité. L'OP sait déjà que quelque chose ne va pas et demande ici comment y remédier.
Jason
Je suis désolé, n'était-ce pas clair? "Vous ne pouvez pas inclure de paramètres dans la valeur d'action d'un formulaire." Pour le corriger, supprimez les paramètres de la valeur d'action du formulaire.
Jay
@Jay Le problème est clairement que l'utilisateur a besoin des paramètres d'URL pour rester, donc dire "les supprimer" ne va pas aider
Chuck Le Butt
@ChuckLeButt Dire "mais je dois faire cette chose qui ne fonctionne pas" n'est pas une chose utile à dire. Si quelqu'un me dit: "Je continue de tourner le bouton radio mais ma voiture ne bouge pas", la seule réponse à laquelle je pense serait de dire: "Tourner le bouton radio ne fait pas bouger la voiture. Vous devez tourner la clé de contact et appuyez sur la pédale d'accélérateur. " Répondre "mais je dois faire bouger la voiture en tournant le bouton de la radio" est une réponse improductive. Ça ne marche pas. Ça ne marchera pas.
Jay
-3

C'est en réponse au message ci-dessus par Efx:

Si l'URL contient déjà la variable que vous souhaitez modifier, elle est à nouveau ajoutée en tant que champ masqué.

Voici une modification de ce code pour éviter la duplication de vars dans l'URL:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}
TH_
la source
-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

changer la méthode de demande en «POST» au lieu de «GET».

Shashidhar Gr
la source
-4

J'écris habituellement quelque chose comme ça:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

Cela fonctionne, mais n'oubliez pas de nettoyer vos entrées contre les attaques XSS!

Rápli András
la source