Finalidade original de <input type = “hidden”>? [fechadas]

101

Estou curioso sobre o propósito original da <input type="hidden">tag.

Hoje em dia, é frequentemente usado junto com o JavaScript para armazenar variáveis ​​nele que são enviadas ao servidor e coisas assim.

Portanto, o <input type="hidden">existia antes do JavaScript, então qual era seu propósito original? Eu só posso imaginar o envio de um valor do servidor para o cliente que é (inalterado) enviado de volta para manter uma espécie de estado. Ou eu entendi algo errado na história disso e <input type="hidden">sempre deveria ser usado junto com o JavaScript?

Se possível, forneça também referências em suas respostas.

Uooo
fonte
3
Fora do tópico para SO, embora manter o estado também seja minha escolha
Phil,
Concordado, para permitir o rastreamento do estado pré-preenchido (por exemplo, de um substituto PK durante uma edição) que seria automaticamente incluído em um formulário enviado POST / GET
StuartLC
1
Existir antes do JavaScript oferecer suporte a motivos para tê-los ainda mais (ou seja, não diminui nenhum motivo, como esta pergunta parece sugerir) - não havia JavaScript para "armazenar variáveis" ou chamar AJAX ou stub na entrada "não oculta" campos antes de um envio de formulário .. também não havia CSS para outros hacks perversos, como tornar uma entrada de texto normal oculta.
user2246674

Respostas:

108

Eu só posso imaginar o envio de um valor do servidor para o cliente que é (inalterado) enviado de volta para manter uma espécie de estado.

Precisamente. Na verdade, ele ainda está sendo usado para essa finalidade hoje porque o HTTP como o conhecemos hoje ainda é, pelo menos fundamentalmente, um protocolo sem estado.

Na verdade, esse caso de uso foi descrito pela primeira vez no HTML 3.2 (estou surpreso que o HTML 2.0 não inclua essa descrição):

type=hidden
Esses campos não devem ser processados ​​e fornecem um meio para os servidores armazenarem informações de estado com um formulário. Isso será devolvido ao servidor quando o formulário for enviado, usando o par nome / valor definido pelos atributos correspondentes. Esta é uma solução alternativa para a ausência de estado do HTTP. Outra abordagem é usar "Cookies" HTTP.

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

Embora valha a pena mencionar que o HTML 3.2 se tornou uma recomendação do W3C somente após o lançamento inicial do JavaScript, é seguro assumir que os campos ocultos sempre serviram para o mesmo propósito.

BoltClock
fonte
A única coisa que eu não gosto em usar entradas 'ocultas' para armazenar dados é que esses dados podem ser manipulados pelos usuários, provavelmente apenas alguém que entende HTML e como modificá-lo por meio de ferramentas de desenvolvimento, mas pode ter implicações ruins sobre o banco de dados se a modificação desses valores corromper outros dados (por exemplo, se você estiver armazenando a referência de chave primária e ela for alterada manualmente pelo usuário).
Brett84c de
3
@ Brett84c: É por isso que você deve sempre validar sua entrada e nunca confiar no cliente;)
BoltClock
Exatamente, eu estava apenas lançando isso para novos desenvolvedores estarem cientes dos possíveis perigos envolvidos.
Brett84c de
2
Nada sobre esses perigos é específico para entradas "ocultas" - qualquer coisa enviada ao cliente pode ser manipulada antes de voltar. Cookies ou alternativas baseadas em JS são iguais.
FLHerne
10

Vou fornecer um exemplo simples do mundo real do lado do servidor aqui, digamos se os registros são repetidos e cada registro tem um formulário com um botão de exclusão e você precisa excluir um registro específico, então aqui vem o hiddencampo em ação, caso contrário, você ganhou ' para obter a referência do registro a ser excluído, neste caso, seráid

Por exemplo

<?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
    }
?>
Sr. estrangeiro
fonte
1
Bom exemplo, exceto que o código real deve usar instruções preparadas ou outra maneira de lidar com a entrada SQL com segurança.
Matthew Flaschen
8

Em suma, o objetivo original era fazer um campo que será submetido com o envio do formulário. Às vezes, havia necessidade de armazenar alguma informação em campo oculto (por exemplo, id do usuário) e submetê-la com o envio do formulário.

Da especificação HTML de 22 de setembro de 1995

Um elemento INPUT com `TYPE = HIDDEN 'representa um campo oculto. O usuário não interage com este campo; em vez disso, o atributo VALUE especifica o valor do campo. Os atributos NAME e VALUE são obrigatórios.

Chuck Norris
fonte
1
Você poderia elaborar essa resposta e / ou dar alguma referência a esse comportamento de enviar os campos ocultos após o envio de um formulário?
GitaarLAB
@GitaarLAB, dei um exemplo (id do usuário) ... Enfim, existem muitos exemplos na web. Por exemplo echoecho.com/htmlforms07.htm
Chuck Norris
1
Sinto muito, para mim a linha: original purpose was to make a field which will be submitted *after* form's submité ambígua. Ela pode ser interpretada como: 'depois que o formulário é feito a postar seus dados, em seguida, o campo escondido será submetido (a um lugar misterioso)'. Daí meu comentário acima.
GitaarLAB
1
Entendi :) Obrigado pelo seu comentário, editei minha resposta. Foi apenas um erro de ortografia (ainda não alcancei o nível de guru em inglês: D).
Chuck Norris
6

Os valores dos elementos do formulário incluindo type = 'hidden' são enviados ao servidor quando o formulário é postado. valores de entrada type = "ocultos" não são visíveis na página. Manter IDs de usuário em campos ocultos, por exemplo, é um dos muitos usos.

SO usa um campo oculto para o clique de voto positivo.

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

Usando esse valor, o script do lado do servidor pode armazenar o upvote.

cPu1
fonte
Haha, boa pegada! E quando eu acrescento um "x" no final do valor, ocorre um erro ao votar: D
Uooo
@Uooo E você pode exibi-lo ou alterar diretamente o valor. Você pode alterar o valor para uma resposta diferente. Você pode então clicar no botão upvote e ele será registrado como upvote para uma resposta diferente. ;)
Geoffrey Hale
5

basicamente campos ocultos serão mais úteis e vantagens para usar com o formulário de várias etapas. podemos usar campos ocultos para passar as informações de uma etapa para a próxima etapa usando ocultos e mantê-los encaminhando até a etapa final.

  1. Tokens CSRF.

A falsificação de solicitação entre sites é uma vulnerabilidade muito comum em sites. Exigir um token secreto específico do usuário em todos os envios de formulário evitará ataques CSRF, pois os sites de ataque não conseguem adivinhar qual é o token adequado e qualquer envio de formulário que eles executem em nome do usuário sempre falhará.

  1. Salve o estado em formulários de várias páginas.

Se você precisar armazenar em qual etapa de um formulário de várias páginas o usuário está, use os campos de entrada ocultos. O usuário não precisa ver essas informações, portanto, esconda-as em um campo de entrada oculto.

Regra geral: Use o campo para armazenar tudo o que o usuário não precisa ver, mas que deseja enviar ao servidor no envio do formulário.

Ganesh Bora
fonte