Objectif initial de <input type = “hidden”>? [fermé]


101

Je suis curieux de savoir quel est le but initial du <input type="hidden">tag.

De nos jours, il est souvent utilisé avec JavaScript pour stocker des variables qui sont envoyées au serveur et des choses comme ça.

Par conséquent, le <input type="hidden">existait avant JavaScript, alors quel était son objectif initial? Je ne peux qu'imaginer d'envoyer une valeur du serveur au client qui est (inchangée) renvoyée pour maintenir une sorte d'état. Ou est-ce que je me trompe dans son histoire et que j'ai <input type="hidden">toujours été censé être utilisé avec JavaScript?

Si possible, veuillez également donner des références dans vos réponses.


3
Hors sujet pour SO, bien que le maintien de l'état soit également mon choix
Phil

Accepté, pour permettre le suivi de l'état pré-rempli (par exemple d'un substitut PK lors d'une édition) qui serait automatiquement inclus dans un formulaire soumis POST / GET
StuartLC

1
Existant avant que JavaScript ne prenne en charge les raisons de les avoir encore plus (c'est-à-dire que cela n'enlève aucune raison comme cette question semble l'impliquer) - il n'y avait pas de JavaScript pour "stocker des variables" ou appeler AJAX ou stub dans l'entrée "non cachée" champs avant l'envoi d'un formulaire .. il n'y avait pas non plus de CSS pour d'autres hacks pervers tels que masquer une entrée de texte normale.
user2246674

Réponses:


108

Je ne peux qu'imaginer d'envoyer une valeur du serveur au client qui est (inchangée) renvoyée pour maintenir une sorte d'état.

Précisément. En fait, il est encore utilisé à cette fin aujourd'hui parce que HTTP tel que nous le connaissons aujourd'hui est toujours, au moins fondamentalement, un protocole sans état.

Ce cas d'utilisation a en fait été décrit pour la première fois en HTML 3.2 (je suis surpris que HTML 2.0 n'ait pas inclus une telle description):

type=hidden
Ces champs ne doivent pas être rendus et fournir un moyen aux serveurs de stocker des informations d'état avec un formulaire. Celui-ci sera renvoyé au serveur lors de la soumission du formulaire, en utilisant la paire nom / valeur définie par les attributs correspondants. Il s'agit d'un contournement pour l'apatridie de HTTP. Une autre approche consiste à utiliser des «cookies» HTTP.

<input type=hidden name=customerid value="c2415-345-8563">

Bien qu'il soit intéressant de mentionner que HTML 3.2 est devenu une recommandation du W3C seulement après la publication initiale de JavaScript, il est prudent de supposer que les champs cachés ont pratiquement toujours servi le même objectif.


La seule chose que je n'aime pas à propos de l'utilisation d'entrées `` cachées '' pour stocker des données est que ces données peuvent être manipulées par les utilisateurs, d'accord, probablement seulement quelqu'un qui comprend le HTML et comment le modifier via des outils de développement, mais pourrait avoir de mauvaises implications sur la base de données si la modification de ces valeurs corrompt d'autres données (par exemple, si vous stockez la référence de clé primaire et qu'elle est modifiée manuellement par l'utilisateur).
Brett84c

3
@ Brett84c: C'est pourquoi vous devriez toujours valider votre entrée et ne jamais faire confiance au client;)
BoltClock

Exactement, je lançais juste cela pour que les nouveaux développeurs soient conscients des dangers possibles.
Brett84c

2
Rien dans ces dangers n'est spécifique aux entrées «cachées» - tout ce qui est envoyé au client peut être manipulé avant de revenir. Les cookies ou les alternatives basées sur JS sont identiques.
FLHerne

10

Je vais fournir un simple exemple du monde réel côté serveur ici, disons si les enregistrements sont en boucle et que chaque enregistrement a un formulaire avec un bouton de suppression et que vous devez supprimer un enregistrement spécifique, alors voici le hiddenchamp en action, sinon vous avez gagné ' t obtenir la référence de l'enregistrement à supprimer dans ce cas, il seraid

Par exemple

<?php
    if(isset($_POST['delete_action'])) {
        mysqli_query($connection, "DELETE FROM table_name 
                                   WHERE record_id = ".$_POST['row_to_be_deleted']);
                                   //Here is where hidden field value is used
    }

    while(condition) {
?>
    <span><?php echo 'Looped Record Name'; ?>
    <form method="post">
        <input type="hidden" name="row_to_be_deleted" value="<?php echo $record_id; ?>" />
        <input type="submit" name="delete_action" />
    </form>
<?php
    }
?>

1
Bon exemple, sauf que le code réel doit utiliser des instructions préparées ou un autre moyen de gérer en toute sécurité l'entrée SQL.
Matthew Flaschen

8

En bref, le but initial était de créer un champ qui sera soumis avec la soumission du formulaire. Parfois, il était nécessaire de stocker certaines informations dans un champ caché (par exemple, l'identifiant de l'utilisateur) et de les soumettre avec la soumission du formulaire.

À partir de la spécification HTML du 22 septembre 1995

Un élément INPUT avec `TYPE = HIDDEN 'représente un champ caché. L'utilisateur n'interagit pas avec ce champ; à la place, l'attribut VALUE spécifie la valeur du champ. Les attributs NAME et VALUE sont obligatoires.


1
Pourriez-vous s'il vous plaît élaborer sur cette réponse et / ou donner une référence à ce comportement de soumission des champs cachés après l'envoi d'un formulaire?
GitaarLAB

@GitaarLAB, j'ai donné un exemple (user Id) ... Quoi qu'il en soit, il y a beaucoup d'exemples sur le web. Par exemple echoecho.com/htmlforms07.htm
Chuck Norris

1
Je suis désolé, pour moi la ligne: original purpose was to make a field which will be submitted *after* form's submitest ambiguë. Il peut être interprété comme: « une fois le formulaire fait l' affichage de ses données, puis le champ caché sera soumis (à un endroit mystérieux). D'où mon commentaire ci-dessus.
GitaarLAB

1
Je comprends :) Merci pour votre commentaire, j'ai édité ma réponse. C'était juste une faute d'orthographe (je n'ai pas encore atteint le niveau de gourou en anglais: D).
Chuck Norris

6

Les valeurs des éléments de formulaire, y compris type = 'hidden', sont soumises au serveur lorsque le formulaire est publié. input type = les valeurs "hidden" ne sont pas visibles dans la page. La conservation des identifiants d'utilisateurs dans des champs masqués, par exemple, est l'une des nombreuses utilisations.

SO utilise un champ masqué pour le clic de vote positif.

<input value="16293741" name="postId" type="hidden">

En utilisant cette valeur, le script côté serveur peut stocker le vote positif.


Haha, bonne prise! Et lorsque j'ajoute un "x" à la fin de la valeur, une erreur se produit lors du vote pour: D
Uooo

@Uooo Et vous pouvez l'afficher ou modifier directement la valeur. Vous pouvez changer la valeur en une réponse différente. Vous pouvez ensuite cliquer sur le bouton de vote positif et il est enregistré comme un vote pour une réponse différente. ;)
Geoffrey Hale

5

les champs essentiellement cachés seront plus utiles et plus avantageux à utiliser avec un formulaire en plusieurs étapes. nous pouvons utiliser des champs cachés pour passer les informations d'une étape à l'étape suivante en utilisant hidden et le garder en avant jusqu'à l'étape de fin.

  1. Jetons CSRF.

La falsification de requêtes intersites est une vulnérabilité de site Web très courante. Exiger un jeton secret et spécifique à l'utilisateur dans toutes les soumissions de formulaire empêchera les attaques CSRF, car les sites d'attaque ne peuvent pas deviner quel est le jeton approprié et toutes les soumissions de formulaire qu'ils effectuent au nom de l'utilisateur échoueront toujours.

  1. Enregistrer l'état dans des formulaires multi-pages.

Si vous avez besoin de stocker dans un formulaire multi-pages à quelle étape l'utilisateur se trouve actuellement, utilisez des champs de saisie masqués. L'utilisateur n'a pas besoin de voir ces informations, alors cachez-les dans un champ de saisie masqué.

Règle générale: utilisez le champ pour stocker tout ce que l'utilisateur n'a pas besoin de voir, mais que vous souhaitez envoyer au serveur lors de la soumission du formulaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.