Pierwotny cel <input type = „hidden”>? [Zamknięte]


101

Ciekawi mnie pierwotne przeznaczenie <input type="hidden">tagu.

Obecnie jest często używany razem z JavaScriptem do przechowywania w nim zmiennych, które są wysyłane na serwer i tym podobne.

Dlatego <input type="hidden">istniał przed JavaScript, więc jaki był jego pierwotny cel? Mogę sobie tylko wyobrazić wysyłanie wartości z serwera do klienta, która jest (niezmieniona) odsyłana w celu utrzymania pewnego rodzaju stanu. Czy może coś mi się nie podoba w historii i <input type="hidden">zawsze miało być używane razem z JavaScriptem?

Jeśli to możliwe, prosimy o podanie odniesień w odpowiedziach.


3
Poza tematem dla SO, chociaż utrzymanie stanu byłoby również moim wyborem
Phil

Zgoda, aby umożliwić śledzenie wstępnie wypełnionego stanu (np. Zastępczego PK podczas edycji), który zostanie automatycznie uwzględniony w przesłanym formularzu POST / GET
StuartLC

1
Istniejące zanim JavaScript obsługuje powody, by mieć je jeszcze więcej (to znaczy nie umniejsza żadnego powodu, jak zdaje się sugerować to pytanie) - nie było kodu JavaScript do „przechowywania zmiennych” lub wywoływania AJAX lub kodu pośredniczącego w „nieukrytym” wejściu pola przed przesłaniem formularza .. nie było również CSS dla innych perwersyjnych hacków, takich jak ukrywanie normalnego wprowadzania tekstu.
user2246674

Odpowiedzi:


108

Mogę sobie tylko wyobrazić wysyłanie wartości z serwera do klienta, która jest (niezmieniona) odsyłana w celu utrzymania pewnego rodzaju stanu.

Dokładnie. W rzeczywistości nadal jest używany do tego celu, ponieważ HTTP, jaki znamy dzisiaj, nadal jest, przynajmniej zasadniczo, protokołem bezstanowym.

Ten przypadek użycia został po raz pierwszy opisany w HTML 3.2 (jestem zaskoczony, że HTML 2.0 nie zawiera takiego opisu):

type=hidden
Te pola nie powinny być renderowane i zapewniać serwerom środki do przechowywania informacji o stanie w formularzu. Zostanie on przekazany z powrotem do serwera po przesłaniu formularza przy użyciu pary nazwa / wartość zdefiniowanej przez odpowiednie atrybuty. Jest to obejście problemu bezstanowego protokołu HTTP. Innym podejściem jest użycie „plików cookie” HTTP.

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

Chociaż warto wspomnieć, że HTML 3.2 stał się zaleceniem W3C dopiero po pierwszym wydaniu JavaScript, można bezpiecznie założyć, że ukryte pola zawsze służyły temu samemu celowi.


Jedną rzeczą, której nie lubię w używaniu `` ukrytych '' danych wejściowych do przechowywania danych, jest to, że dane mogą być manipulowane przez użytkowników, z zastrzeżeniem, prawdopodobnie tylko przez kogoś, kto rozumie HTML i jak go modyfikować za pomocą narzędzi programistycznych, ale może to mieć zły wpływ na baza danych, jeśli modyfikacja tych wartości uszkodzi inne dane (na przykład, jeśli przechowujesz odwołanie do klucza podstawowego i jest ono ręcznie zmieniane przez użytkownika).
Brett84c

3
@ Brett84c: Dlatego zawsze powinieneś sprawdzać swoje dane wejściowe i nigdy nie ufać klientowi;)
BoltClock

Dokładnie, właśnie to rzucałem, aby nowi programiści byli świadomi możliwych zagrożeń.
Brett84c

2
Nic na temat tych niebezpieczeństw nie jest specyficzne dla „ukrytych” danych wejściowych - czymkolwiek wysłanym do klienta można manipulować, zanim wróci. Pliki cookie lub alternatywy oparte na JS są takie same.
FLHerne,

10

Podam tutaj prosty przykład ze świata rzeczywistego po stronie serwera, powiedzmy, czy rekordy są zapętlone, a każdy rekord ma formularz z przyciskiem usuwania i musisz usunąć określony rekord, więc oto hiddenpole w akcji, inaczej wygrałeś ' W takim przypadku uzyskaj odniesienie do rekordu do usunięciaid

Na przykład

<?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
Dobry przykład, poza tym, że rzeczywisty kod powinien wykorzystywać przygotowane instrukcje lub inny sposób bezpiecznej obsługi danych wejściowych SQL.
Matthew Flaschen

8

Krótko mówiąc, pierwotnym celem było utworzenie pola, które zostanie przesłane wraz z przesłaniem formularza. Czasami zachodziła potrzeba zapisania pewnych informacji w ukrytym polu (np. Id użytkownika) i przesłania ich wraz z przesłaniem formularza.

Ze specyfikacji HTML z 22 września 1995 roku

Element INPUT z „TYPE = HIDDEN” reprezentuje ukryte pole. Użytkownik nie wchodzi w interakcję z tym polem; zamiast tego atrybut VALUE określa wartość pola. Atrybuty NAZWA i WARTOŚĆ są wymagane.


1
Czy mógłby Pan rozwinąć tę odpowiedź i / lub podać jakieś odniesienie do zachowania polegającego na przesyłaniu ukrytych pól po przesłaniu formularza?
GitaarLAB

@GitaarLAB, podałem przykład (identyfikator użytkownika) ... W każdym razie jest wiele przykładów w Internecie. Na przykład echoecho.com/htmlforms07.htm
Chuck Norris

1
Przepraszam, linia: original purpose was to make a field which will be submitted *after* form's submitjest niejednoznaczna. Może to być interpretowane jako: „po forma odbywa delegowania swoich danych, a następnie pole ukryte zostaną przedłożone (do tajemniczego miejsca)”. Stąd mój komentarz powyżej.
GitaarLAB

1
Rozumiem :) Dzięki za komentarz, zredagowałem odpowiedź. To był błąd w pisowni (nie osiągnąłeś jeszcze poziomu guru w języku angielskim: D).
Chuck Norris

6

Wartości elementów formularza, w tym type = 'hidden', są przesyłane do serwera podczas wysyłania formularza. input type = „hidden” wartości nie są widoczne na stronie. Na przykład przechowywanie identyfikatorów użytkowników w ukrytych polach jest jednym z wielu zastosowań.

SO używa ukrytego pola dla kliknięcia „za”.

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

Używając tej wartości, skrypt po stronie serwera może przechowywać głos za.


Haha, dobry chwyt! A kiedy dodam „x” na końcu wartości, pojawia się błąd podczas głosowania za: D
Uooo,

@Uooo I możesz go odkryć lub bezpośrednio zmienić wartość. Możesz zmienić wartość na inną odpowiedź. Następnie możesz kliknąć przycisk „za”, a zostanie on zarejestrowany jako głos za inną odpowiedzią. ;)
Geoffrey Hale

5

w zasadzie ukryte pola będą bardziej przydatne, a korzystanie z formularza wieloetapowego będzie bardziej korzystne. możemy użyć ukrytych pól, aby przekazać informacje o jednym kroku do następnego kroku, używając ukrytych i utrzymywać je do końca kroku.

  1. Tokeny CSRF.

Fałszowanie żądań między lokacjami jest bardzo częstą luką w zabezpieczeniach witryn internetowych. Wymaganie tajnego tokenu specyficznego dla użytkownika we wszystkich przesyłanych formularzach zapobiegnie atakom CSRF, ponieważ strony atakujące nie mogą odgadnąć, jaki jest właściwy token, a wszelkie przesłania formularzy, które wykonują w imieniu użytkownika, zawsze kończą się niepowodzeniem.

  1. Zapisz stan w wielostronicowych formularzach.

Jeśli chcesz zapisać krok w wielostronicowym formularzu, w którym aktualnie znajduje się użytkownik, użyj ukrytych pól wejściowych. Użytkownik nie musi widzieć tych informacji, więc ukryj je w ukrytym polu wprowadzania.

Zasada ogólna: pole to służy do przechowywania wszystkiego, czego użytkownik nie musi widzieć, ale co chcesz wysłać na serwer podczas przesyłania formularza.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.