Scopo originale di <input type = "hidden">? [chiuso]


101

Sono curioso dello scopo originale del <input type="hidden">tag.

Al giorno d'oggi viene spesso utilizzato insieme a JavaScript per memorizzare variabili al suo interno che vengono inviate al server e cose del genere.

Pertanto, <input type="hidden">esisteva prima di JavaScript, quindi qual era il suo scopo originale? Posso solo immaginare di inviare un valore dal server al client che viene (invariato) rimandato indietro per mantenere una sorta di stato. O ho sbagliato qualcosa nella cronologia di esso e <input type="hidden">doveva essere sempre utilizzato insieme a JavaScript?

Se possibile, fornisci anche riferimenti nelle tue risposte.


3
Fuori tema per SO, anche se il mantenimento dello stato sarebbe anche la mia scelta
Phil

Concordato, per consentire il monitoraggio dello stato pre-popolato (ad esempio di un PK surrogato durante una modifica) che verrebbe automaticamente incluso in un modulo inviato POST / GET
StuartLC

1
Esistendo prima che JavaScript supporti i motivi per averli ancora di più (ovvero, non sminuisce alcun motivo come questa domanda sembra implicare) - non c'era JavaScript per "memorizzare variabili" o chiamare AJAX o stub nell'input "non nascosto" campi prima dell'invio di un modulo .. non c'erano nemmeno CSS per altri hack perversi come nascondere un normale input di testo.
user2246674

Risposte:


108

Posso solo immaginare di inviare un valore dal server al client che viene (invariato) rimandato indietro per mantenere una sorta di stato.

Precisamente. In effetti, viene ancora utilizzato per questo scopo oggi perché HTTP come lo conosciamo oggi è ancora, almeno fondamentalmente, un protocollo senza stato.

Questo caso d'uso è stato effettivamente descritto per la prima volta in HTML 3.2 (sono sorpreso che HTML 2.0 non includesse una descrizione del genere):

type=hidden
Questi campi non devono essere visualizzati e forniscono ai server un mezzo per memorizzare le informazioni sullo stato con un modulo. Questo verrà ritrasmesso al server quando il modulo viene inviato, utilizzando la coppia nome / valore definita dagli attributi corrispondenti. Questo è un modo per aggirare l'apolidia di HTTP. Un altro approccio consiste nell'utilizzare i "cookie" HTTP.

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

Anche se vale la pena ricordare che HTML 3.2 è diventato una raccomandazione del W3C solo dopo il rilascio iniziale di JavaScript, è lecito ritenere che i campi nascosti abbiano praticamente sempre servito allo stesso scopo.


L'unica cosa che non mi piace dell'utilizzo di input 'nascosti' per memorizzare i dati è che quei dati possono essere manipolati dagli utenti, concesso, probabilmente solo qualcuno che capisce l'HTML e come modificarlo tramite strumenti di sviluppo, ma potrebbe avere cattive implicazioni su il database se la modifica di tali valori danneggia altri dati (ad esempio, se si memorizza il riferimento alla chiave primaria e viene modificato manualmente dall'utente).
Brett84c

3
@ Brett84c: Ecco perché dovresti sempre convalidare il tuo input e non fidarti mai del cliente;)
BoltClock

Esatto, lo stavo solo buttando là fuori perché i nuovi sviluppatori fossero consapevoli dei possibili pericoli coinvolti.
Brett84c

2
Niente di questi pericoli è specifico per gli input "nascosti": qualsiasi cosa inviata al client può essere manipolata prima che ritorni. I cookie o le alternative basate su JS sono la stessa cosa.
FLHerne

10

Fornirò un semplice esempio del mondo reale lato server qui, diciamo se i record sono in loop e ogni record ha un modulo con un pulsante Elimina e devi eliminare un record specifico, quindi ecco che arriva il hiddencampo in azione, altrimenti hai vinto ' Per ottenere il riferimento del record da eliminare in questo caso, saràid

Per esempio

<?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
Buon esempio, ad eccezione del fatto che il codice reale dovrebbe utilizzare istruzioni preparate o un altro modo per gestire in modo sicuro l'input SQL.
Matthew Flaschen

8

In breve, lo scopo originale era quello di creare un campo che verrà inviato con l'invio del modulo. A volte, era necessario memorizzare alcune informazioni in un campo nascosto (ad esempio, l'ID dell'utente) e inviarle con l'invio del modulo.

Dalle specifiche HTML del 22 settembre 1995

Un elemento INPUT con "TYPE = HIDDEN" rappresenta un campo nascosto. L'utente non interagisce con questo campo; invece, l'attributo VALUE specifica il valore del campo. Gli attributi NAME e VALUE sono obbligatori.


1
Potresti approfondire quella risposta e / o fornire qualche riferimento a questo comportamento di inviare i campi nascosti dopo l'invio di un modulo?
GitaarLAB

@GitaarLAB, ho fornito un esempio (ID utente) ... Comunque, ci sono molti esempi nel web. Ad esempio echoecho.com/htmlforms07.htm
Chuck Norris

1
Mi dispiace, per me la battuta: original purpose was to make a field which will be submitted *after* form's submitè ambigua. Esso può essere interpretato come: 'dopo che il modulo è fatto inviare i suoi dati, quindi il campo nascosto sarà sottoposta (per un luogo misterioso)'. Quindi, il mio commento sopra.
GitaarLAB

1
Ho capito :) Grazie per il tuo commento, ho modificato la mia risposta. Era solo un errore di ortografia (non ho ancora raggiunto il livello guru in inglese: D).
Chuck Norris

6

I valori degli elementi del modulo incluso type = 'hidden' vengono inviati al server quando il modulo viene pubblicato. input type = valori "hidden" non sono visibili nella pagina. Il mantenimento degli ID utente nei campi nascosti, ad esempio, è uno dei tanti usi.

Così utilizza un campo nascosto per il clic di voto positivo.

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

Utilizzando questo valore, lo script lato server può memorizzare il voto positivo.


Haha, buona cattura! E quando aggiungo una "x" alla fine del valore si verifica un errore durante la votazione: D
Uooo

@Uooo E puoi scoprirlo o modificare direttamente il valore. È possibile modificare il valore in una risposta diversa. È quindi possibile fare clic sul pulsante di voto positivo e viene registrato come voto positivo per una risposta diversa. ;)
Geoffrey Hale

5

fondamentalmente i campi nascosti saranno più utili e vantaggi da utilizzare con il modulo multi-passaggio. possiamo utilizzare i campi nascosti per passare le informazioni di un passaggio al passaggio successivo utilizzando nascosto e mantenerlo inoltrato fino al passaggio finale.

  1. Token CSRF.

La contraffazione di richieste tra siti è una vulnerabilità molto comune del sito web. La richiesta di un token segreto specifico dell'utente in tutti gli invii di moduli impedirà gli attacchi CSRF poiché i siti di attacco non sono in grado di indovinare quale sia il token corretto e qualsiasi invio di modulo che eseguono per conto dell'utente fallirà sempre.

  1. Salva lo stato in moduli a più pagine.

Se è necessario memorizzare il passaggio in un modulo multipagina in cui si trova attualmente l'utente, utilizzare i campi di input nascosti. L'utente non ha bisogno di vedere queste informazioni, quindi nascondile in un campo di input nascosto.

Regola generale: utilizzare il campo per memorizzare tutto ciò che l'utente non ha bisogno di vedere, ma che si desidera inviare al server al momento dell'invio del modulo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.