Ursprünglicher Zweck von <input type = “hidden”>? [geschlossen]


101

Ich bin gespannt auf den ursprünglichen Zweck des <input type="hidden">Tags.

Heutzutage wird es oft zusammen mit JavaScript verwendet, um darin gespeicherte Variablen zu speichern, die an den Server gesendet werden, und solche Dinge.

Daher <input type="hidden">existierte das vor JavaScript, also was war sein ursprünglicher Zweck? Ich kann mir nur vorstellen, einen Wert vom Server an den Client zu senden, der (unverändert) zurückgesendet wird, um eine Art Status beizubehalten. Oder habe ich in der Geschichte etwas falsch gemacht und <input type="hidden">sollte immer zusammen mit JavaScript verwendet werden?

Wenn möglich, geben Sie bitte auch Referenzen in Ihren Antworten an.


3
Off Topic für SO, obwohl die Aufrechterhaltung des Zustands auch meine Wahl wäre
Phil

Einverstanden, um die Verfolgung des
vorbestückten

1
Bestehend, bevor JavaScript Gründe unterstützt , um sie noch mehr zu haben (das heißt, es lenkt keinen Grund ab, wie diese Frage zu implizieren scheint) - es gab kein JavaScript, um Variablen zu "speichern" oder AJAX oder Stub in "nicht versteckten" Eingaben aufzurufen Felder vor dem Senden eines Formulars. Es gab auch kein CSS für andere perverse Hacks, z. B. das Ausblenden einer normalen Texteingabe.
user2246674

Antworten:


108

Ich kann mir nur vorstellen, einen Wert vom Server an den Client zu senden, der (unverändert) zurückgesendet wird, um eine Art Status beizubehalten.

Genau. Tatsächlich wird es heute noch für diesen Zweck verwendet, da HTTP, wie wir es heute kennen, zumindest im Grunde genommen immer noch ein zustandsloses Protokoll ist.

Dieser Anwendungsfall wurde tatsächlich zuerst in HTML 3.2 beschrieben (ich bin überrascht, dass HTML 2.0 keine solche Beschreibung enthielt):

type=hidden
Diese Felder sollten nicht gerendert werden und bieten Servern die Möglichkeit, Statusinformationen mit einem Formular zu speichern. Dies wird beim Senden des Formulars unter Verwendung des durch die entsprechenden Attribute definierten Name / Wert-Paares an den Server zurückgegeben. Dies ist eine Lösung für die Staatenlosigkeit von HTTP. Ein anderer Ansatz ist die Verwendung von HTTP "Cookies".

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

Erwähnenswert ist, dass HTML 3.2 erst nach der ersten Veröffentlichung von JavaScript zu einer W3C-Empfehlung wurde. Man kann jedoch davon ausgehen, dass versteckte Felder so gut wie immer denselben Zweck erfüllt haben.


Das einzige, was ich an der Verwendung von 'versteckten' Eingaben zum Speichern von Daten nicht mag, ist, dass diese Daten von Benutzern manipuliert werden können, wahrscheinlich nur von jemandem, der HTML versteht und weiß, wie man es über Entwicklungstools ändert, aber schlechte Auswirkungen haben kann Die Datenbank beschädigt andere Daten, wenn Änderungen an diesen Werten vorgenommen werden (z. B. wenn Sie die Primärschlüsselreferenz speichern und diese vom Benutzer manuell geändert wird).
Brett84c

3
@ Brett84c: Deshalb sollten Sie Ihre Eingabe immer validieren und dem Client niemals vertrauen;)
BoltClock

Genau, ich habe das nur rausgeschmissen, damit neue Entwickler sich der möglichen Gefahren bewusst werden.
Brett84c

2
Nichts an diesen Gefahren ist spezifisch für "versteckte" Eingaben - alles , was an den Client gesendet wird, kann manipuliert werden, bevor es zurückkommt. Cookies oder JS-basierte Alternativen sind genauso.
FLHerne

10

Ich werde hier ein einfaches Beispiel für die serverseitige reale Welt bereitstellen. Sagen wir, wenn die Datensätze in einer Schleife ausgeführt werden und jeder Datensatz ein Formular mit einer Löschtaste hat und Sie einen bestimmten Datensatz löschen müssen. Hier kommt also das hiddenFeld in Aktion, sonst haben Sie gewonnen. ' In diesem Fall wird die Referenz des zu löschenden Datensatzes nicht abgerufenid

Beispielsweise

<?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
Gutes Beispiel, außer dass echter Code vorbereitete Anweisungen oder eine andere Methode verwenden sollte, um SQL-Eingaben sicher zu verarbeiten.
Matthew Flaschen

8

Kurz gesagt, der ursprüngliche Zweck bestand darin, ein Feld zu erstellen, das zusammen mit dem Formular eingereicht wird. Manchmal mussten einige Informationen in einem versteckten Feld gespeichert werden (z. B. die ID des Benutzers) und mit dem Formular "Senden" gesendet werden.

Aus der HTML-Spezifikation vom 22. September 1995

Ein INPUT-Element mit "TYPE = HIDDEN" stellt ein verstecktes Feld dar. Der Benutzer interagiert nicht mit diesem Feld. Stattdessen gibt das Attribut VALUE den Wert des Felds an. Die Attribute NAME und VALUE sind erforderlich.


1
Könnten Sie bitte diese Antwort näher erläutern und / oder auf dieses Verhalten beim Senden der ausgeblendeten Felder nach dem Senden eines Formulars verweisen?
GitaarLAB

@ GitaarLAB, ich habe ein Beispiel gegeben (Benutzer-ID) ... Wie auch immer, es gibt viele Beispiele im Web. Zum Beispiel echoecho.com/htmlforms07.htm
Chuck Norris

1
Es tut mir leid, für mich ist die Zeile: original purpose was to make a field which will be submitted *after* form's submitmehrdeutig. Es kann interpretiert werden als: 'Nachdem das Formular seine Daten veröffentlicht hat, dann das versteckte Feld (an einen mysteriösen Ort) gesendet." Daher mein Kommentar oben.
GitaarLAB

1
Ich verstehe :) Danke für deinen Kommentar, ich habe meine Antwort bearbeitet. Es war nur ein Rechtschreibfehler (habe das Guru-Niveau in Englisch noch nicht erreicht: D).
Chuck Norris

6

Die Werte von Formularelementen, einschließlich type = 'hidden', werden beim Versenden des Formulars an den Server gesendet. input type = "versteckte" Werte sind auf der Seite nicht sichtbar. Das Verwalten von Benutzer-IDs in ausgeblendeten Feldern ist beispielsweise eine der vielen Verwendungsmöglichkeiten.

SO verwendet ein verstecktes Feld für den Upvote-Klick.

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

Mit diesem Wert kann das serverseitige Skript die Upvote speichern.


Haha, guter Fang! Und wenn ich ein "x" am Ende des Wertes anhänge, tritt beim Upvoting ein Fehler auf: D
Uooo

@Uooo Und Sie können es einblenden oder den Wert direkt ändern. Sie können den Wert in eine andere Antwort ändern. Sie können dann auf die Schaltfläche "Upvote" klicken und diese wird als Upvote für eine andere Antwort protokolliert. ;)
Geoffrey Hale

5

Grundsätzlich sind versteckte Felder nützlicher und bieten Vorteile bei der Verwendung mit mehrstufigen Formularen. Wir können ausgeblendete Felder verwenden, um Informationen zu einem Schritt mithilfe von ausgeblendeten an den nächsten Schritt weiterzugeben und sie bis zum Endschritt weiterzuleiten.

  1. CSRF-Token.

Die Fälschung von standortübergreifenden Anfragen ist eine sehr häufige Sicherheitslücke auf der Website. Das Erfordernis eines geheimen, benutzerspezifischen Tokens in allen Formularübermittlungen verhindert CSRF-Angriffe, da Angriffsseiten nicht erraten können, was das richtige Token ist, und alle Formularübermittlungen, die sie im Namen des Benutzers ausführen, schlagen immer fehl.

  1. Status in mehrseitigen Formularen speichern.

Wenn Sie in einem mehrseitigen Formular speichern müssen, in welchem ​​Schritt sich der Benutzer gerade befindet, verwenden Sie ausgeblendete Eingabefelder. Der Benutzer muss diese Informationen nicht sehen, also verstecken Sie sie in einem versteckten Eingabefeld.

Allgemeine Regel: Verwenden Sie das Feld, um alles zu speichern, was der Benutzer nicht sehen muss, das Sie jedoch beim Senden des Formulars an den Server senden möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.