Jakie znaki są dozwolone w atrybucie Nazwa HTML wewnątrz znacznika wejściowego?

83

Mam skrypt PHP, który generuje <input>s dynamicznie, więc zastanawiałem się, czy muszę filtrować jakiekolwiek znaki w nameatrybucie.

Wiem, że imię musi zaczynać się od litery, ale innych reguł nie znam. Nawiasy kwadratowe muszą być dozwolone, ponieważ PHP używa ich do tworzenia tablic z danych formularza. A co z nawiasami? Spaces?

DLH
źródło

Odpowiedzi:

28

Jedynym rzeczywistym ograniczeniem co do tego, jakie znaki mogą pojawiać się w nazwach kontrolek formularzy, jest przesłanie formularza za pomocą GET

Metoda „get” ogranicza wartości zestawu danych formularza do znaków ASCII. " odniesienie

Jest to dobry wątek na nim tutaj .

Allain Lalonde
źródło
Czy więc namema inny typ danych dla <input>niż dla innych elementów? Ciekawy.
DLH
Jest taki sam jak <a>większość elementów, ale różni się od<meta>
Alohci
4
Tak. Właśnie wypróbowałem atrybut <input>ze wszystkimi rodzajami bzdur w nameatrybucie i sprawdzono go w HTML 4.01 Strict. Przyjęty!
DLH
Twitter używa tego rodzaju nazwy, jest to szczególny powód, aby uzyskać ogłoszenie ...... użytkownik [hasło_użytkownika], użytkownik [adres e-mail]
Vishal Sharma
1
„Jedynym rzeczywistym ograniczeniem dotyczącym tego, jakie znaki mogą pojawiać się w nazwach kontrolek formularzy, jest przesłanie formularza za pomocą GET” - Nie. To nie ogranicza tego, co może pojawić się w nazwie, oznacza po prostu, że po konwersji musi być zakodowana w postaci adresu URL do adresu URL.
Quentin
55

Zwróć uwagę, że nie wszystkie znaki są przesyłane jako nameatrybuty pól formularza (nawet przy użyciu POST)!

Znaki odstępów są przycinane, a wewnętrzne znaki odstępu oraz znak .są zastępowane przez _. (Testowane w Chrome 23, Firefox 13 i Internet Explorer 9, wszystkie w systemie Windows 7.)

Matthias Samsel
źródło
11
Dzięki za dodanie tego powiadomienia, stary. Miałem zacząć kodować przy użyciu. jako separator.
Davis Peixoto,
1
Wewnętrzne odstępy są zastępowane znakiem plus (+) zgodnie z tą stroną: w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit
thdoan
2
Ja drugi @Dave. Dla tych, którzy myśleli o tym samym, prawdopodobnie szukasz danych wejściowych w stylu tablicowym: first[second]zamiast first.second.
JD
5
Chciałbym zauważyć, że jest to kwestia specyficzna dla serwera, a nie przeglądarka. Testowane na Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 i Safari Windows 5 i wszystkie z nich wysłały „test this.stuff” (cztery początkowe spacje) jako nazwę w POST do serwer deweloperski ASP.NET dołączony do VS2012.
abluejelly
3
Zobacz komentarz @ Aleksandra poniżej. Niektóre serwery mogą konwertować „.” do „_”, ale nie dzieje się to w przeglądarce.
Jeff Lowery
38

Każdy znak, który można umieścić w pliku HTML [X], można umieścić w pliku <input name>. Jak mówi komentarz Allaina, <input name>jest definiowany jako zawierającyCDATA , więc jedyne rzeczy, których nie możesz tam umieścić, to kody kontrolne i nieprawidłowe punkty kodowe, których podstawowy standard (SGML lub XML) nie zezwala.

Allain zacytował W3 ze specyfikacji HTML4:

Uwaga. Metoda „get” ogranicza wartości zestawu danych formularza do znaków ASCII. Określono tylko metodę „post” (z enctype = „multipart / form-data”) w celu pokrycia całego zestawu znaków ISO10646.

Jednak w praktyce nie jest to prawdą.

Teoria mówi, że application/x-www-form-urlencodeddane nie mają mechanizmu do określania kodowania nazw lub wartości formularza, więc użycie znaków spoza zestawu ASCII w jednym z nich jest „nieokreślone” jako działające i multipart/form-datazamiast tego należy użyć metody POST .

Niestety w prawdziwym świecie żadna przeglądarka nie określa kodowania pól, nawet jeśli teoretycznie by to możliwe, w nagłówkach podpunktu multipart/form-datatreści żądania POST. (Myślę, że Mozilla próbowała go raz zaimplementować, ale wycofała się, ponieważ zepsuła serwery).

Żadna przeglądarka nie implementuje zadziwiająco złożonego i brzydkiego standardu RFC2231, który byłby niezbędny do wstawiania zakodowanych nazw pól innych niż ASCII do nagłówków części wieloczęściowej. W każdym razie specyfikacja HTML, która definiuje multipart/form-data, nie mówi bezpośrednio, że należy użyć RFC2231, i ponownie, jeśli spróbujesz, zepsuje serwery.

W rzeczywistości sytuacja jest taka, że ​​nie ma sposobu, aby dowiedzieć się, jakie kodowanie jest używane dla nazw i wartości w przesłanym formularzu, bez względu na typ formularza. To, co przeglądarki zrobią z nazwami pól i wartościami, które zawierają znaki inne niż ASCII, jest takie samo dla GET i obu typów formularza POST: koduje je przy użyciu kodowania strony zawierającej użyty formularz. Nazwy formularzy GET spoza ASCII nie są bardziej zepsute niż wszystko inne.

DLH:

Czyli nazwa ma inny typ danych niż dla innych elementów?

Właściwie jedynym elementem, którego nameatrybutem nie CDATAjest, jest <meta>. Zobacz listę atrybutów specyfikacji HTML4 dla wszystkich różnych zastosowań name; jest to przeciążona nazwa atrybutu, mająca wiele różnych znaczeń dla różnych elementów. Jest to ogólnie uważane za złe.

Jednak zazwyczaj w dzisiejszych czasach należy unikać namez wyjątkiem pól formularza (gdzie jest to nazwa kontrolki) i param(gdzie jest to identyfikator parametru specyficzny dla wtyczki). To tylko dwa znaczenia, z którymi trzeba się zmagać. Należy unikać starodawnego stosowania nameznaku do identyfikowania elementów, takich jak <form>lub <a>na stronie (użyj idzamiast tego).

bobince
źródło
9

Chociaż komentarz Allaina był odpowiedzią na bezpośrednie pytanie OP, a bob, ponieważ dostarczył genialnych i szczegółowych informacji, uważam, że wiele osób przychodzi tutaj, szukając odpowiedzi na bardziej szczegółowe pytanie: „Czy mogę użyć kropki w atrybucie nazwy wejściowej formularza?”

Ponieważ ten wątek pojawił się jako pierwszy wynik, kiedy szukałem tej wiedzy, zgadłem, że równie dobrze mogę podzielić się tym, co znalazłem.

Po pierwsze, Matthias 'stwierdził, że:

postać . są zastąpione przez _

To nieprawda. Nie wiem, czy przeglądarka faktycznie wykonała tego rodzaju operację w 2013 roku - chociaż wątpię w to. Przeglądarki wysyłają kropki bez zmian (mowa o danych POST)! Możesz to sprawdzić w narzędziach programistycznych dowolnej przyzwoitej przeglądarki.

Proszę, zwróć uwagę na mały komentarz abluejelly, który prawdopodobnie jest pomijany przez wielu:

Chciałbym zauważyć, że jest to kwestia specyficzna dla serwera, a nie przeglądarka. Testowane na Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 i Safari Windows 5 i wszystkie z nich wysłały „test this.stuff” (cztery początkowe spacje) jako nazwę w POST do serwer deweloperski ASP.NET dołączony do VS2012.

Sprawdziłem to na serwerze Apache HTTP (v2.4.25) i rzeczywiście nazwa wejściowa, taka jak „foo.bar”, została zmieniona na „foo_bar”. Ale w nazwie takiej jak „foo [foo.bar]” kropka nie jest zastępowana przez _!

Mój wniosek: możesz użyć kropek, ale nie użyłbym tego, ponieważ może to prowadzić do nieoczekiwanych zachowań w zależności od używanego serwera HTTP .

Aleksander Stelmaczonek
źródło
co się dzieje? Jeśli użyję name = "foo bar".
skwal
0

Czy masz na myśli atrybuty id i name znacznika wejściowego HTML?

Jeśli tak, to bardzo bym się kusił, by ograniczyć (lub przekonwertować) dozwolone „wprowadzanie” znaków nazwy tylko na az (AZ), 0-9 i ograniczony zakres interpunkcji („.”, „,” Itd.), choćby po to, by ograniczyć potencjał exploitów XSS itp.

Ponadto po co pozwalać użytkownikowi kontrolować dowolny aspekt tagu wejściowego? (Może z punktu widzenia walidacji może nie być łatwiejsze zachowanie nazw znaczników wejściowych to „custom_1”, „custom_2” itp., A następnie zmapowanie ich zgodnie z wymaganiami).

John Parker
źródło
Mogę nie generować moich nazwisk w ten sposób. Jestem właśnie w trakcie zastanawiania się, jak umożliwić mniej obeznanym z technologią członkom mojego biura określanie pól formularza.
DLH
@DLH Kusi mnie (aby wyeliminować ryzyko kolizji nazw itp.) Do tylko pośredniego podejścia, jak powyżej. :-)
John Parker