Mam skrypt PHP, który generuje <input>
s dynamicznie, więc zastanawiałem się, czy muszę filtrować jakiekolwiek znaki w name
atrybucie.
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?
name
ma inny typ danych dla<input>
niż dla innych elementów? Ciekawy.<a>
większość elementów, ale różni się od<meta>
<input>
ze wszystkimi rodzajami bzdur wname
atrybucie i sprawdzono go w HTML 4.01 Strict. Przyjęty!Zwróć uwagę, że nie wszystkie znaki są przesyłane jako
name
atrybuty 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.)źródło
first[second]
zamiastfirst.second
.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:
Jednak w praktyce nie jest to prawdą.
Teoria mówi, że
application/x-www-form-urlencoded
dane 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 imultipart/form-data
zamiast 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-data
treś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:
Właściwie jedynym elementem, którego
name
atrybutem nieCDATA
jest, 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ć
name
z wyjątkiem pól formularza (gdzie jest to nazwa kontrolki) iparam
(gdzie jest to identyfikator parametru specyficzny dla wtyczki). To tylko dwa znaczenia, z którymi trzeba się zmagać. Należy unikać starodawnego stosowanianame
znaku do identyfikowania elementów, takich jak<form>
lub<a>
na stronie (użyjid
zamiast tego).źródło
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:
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:
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 .
źródło
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).
źródło