Какие символы разрешены в атрибуте HTML Name внутри тега ввода?

у меня есть php-скрипт, который будет генерировать <input>s динамически, поэтому мне было интересно, нужно ли фильтровать любые символы в

5 ответов


единственное реальное ограничение на то, какие символы могут отображаться в именах элементов управления формой, - это когда форма отправляется с GET

"метод" get " ограничивает значения набора данных формы символами ASCII."ссылка

на нем есть хорошая нить здесь.


обратите внимание, что не все персонажи представлены для name атрибуты полей формы (даже при использовании POST)!

символы белого пространства обрезаются и внутренние символы белого пространства, а также символ . заменены _. (Протестировано в Chrome 23, Firefox 13 и Internet Explorer 9, Все Win7.)


любой символ, который вы можете включить в [X]HTML-файл, можно поместить в <input name>. Как говорится в комментарии Аллейна,<input name> определен как содержащий CDATA, поэтому единственное, что вы не можете поместить туда, - это управляющие коды и недопустимые кодовые точки, которые запрещает базовый стандарт (SGML или XML).

Allain процитировал W3 из спецификации HTML4:

Примечание. Метод " get " ограничивает значения набора данных формы символами ASCII. Только метод" post " (с enctype= "multipart / form-data") указывается для покрытия всего набора символов ISO10646.

однако на практике это не так.

теория такова application/x-www-form-urlencoded данные не имеют механизма для указания кодировки имен или значений формы, поэтому использование символов, отличных от ASCII, в любом из них" не указано", как работает, и вы должны использовать POSTed .

к сожалению, в реальном мире, ни один браузер определяет кодировку поля, даже если теоретически это возможно, в заголовках подразделов a multipart/form-data тело запроса POST. (Я считаю, что Mozilla пыталась реализовать его один раз, но отступила, поскольку она сломала серверы.)

и ни один браузер не реализует удивительно сложный и уродливый RFC2231 стандарт, который необходим для вставки закодированных имен полей, отличных от ASCII, в заголовки вложенных частей multipart. В любом случае, спецификация HTML, которая определяет multipart/form-data сразу не говорит что RFC2231 должно быть использовано, и, опять же, это сломает серверы, если вы попытаетесь.

таким образом, реальность ситуации заключается в том, что нет способа узнать, какая кодировка используется для имен и значений в представлении формы, независимо от типа формы. То, что браузеры будут делать с именами полей и значениями, содержащими символы, отличные от ASCII, одинаково для GET и обоих типов POST form: он кодирует их с помощью кодировки страницы, содержащей используемую форму. Non-ASCII получить имена форм не более сломаны, чем все остальное.

DLH:

таким образом, имя имеет другой тип данных, чем для других элементов?

фактически единственный элемент, чей не CDATA и <meta>. Увидеть HTML4 спец -список атрибутов для всех различных видов использования name; это перегруженное имя атрибута, имеющее много разных значений на разных элементах. Это обычно считается плохим вещь.

однако, как правило, в эти дни вы бы избежать name за исключением полей формы (где это имя элемента управления) и param (где это идентификатор конкретного плагина). Это всего лишь два значения. Использование старой школы name для идентификации таких элементов, как <form> или <a> на странице следует избегать (используйте id вместо).


в то время как комментарий Аллейна ответил на прямой вопрос OP, а бобинс предоставил блестящую подробную информацию, я считаю, что многие люди приходят сюда в поисках ответа на более конкретный вопрос: "Могу ли я использовать символ точки в атрибуте имени ввода формы?"

поскольку этот поток появился как первый результат, когда я искал это знание, я догадался, что могу также поделиться тем, что я нашел.

во-первых, Матиас утверждал, что:

символ . заменены _

Это неправда. Я не знаю, действительно ли браузер делал такую операцию в 2013 году, хотя я сомневаюсь в этом. Браузеры отправляют точечные символы, как они есть (говоря о почтовых данных)! Вы можете проверить это в инструментах разработчика любого приличного браузера.

пожалуйста, обратите внимание, что крошечный маленький комментарий abluejelly, что, вероятно, пропустили многие:

Я хотел бы отметить, что это серверная вещь, а не браузерная вещь. Проверена на Win7 FF3 / 3.5 / 31, IE5/7/8/9/10/Edge, Chrome39 и Safari Windows 5, и все они отправили " проверить это.stuff " (четыре ведущих пробела) как имя в сообщении к ASP.NET dev-сервер в комплекте с VS2012.

Я проверил его с Apache HTTP server (v2.4.25) и действительно введите имя типа "foo.bar "изменяется на"foo_bar". Но в таком названии, как " фу[фу.bar] " эта точка не заменяется на _!

мои выводы: вы можете использовать точки, но я бы не стал использовать, так как это может привести к некоторым неожиданное поведение в зависимости от используемого сервера HTTP.


вы имеете в виду атрибуты id и name входного тега HTML?

Если это так, я бы очень хотел ограничить (или преобразовать) разрешенные символы "ввода" имени только в a-z (A-Z), 0-9 и ограниченный диапазон знаков препинания (".", ",", п.), если только ограничить потенциал для эксплойтов XSS и т. д.

кроме того, почему пользователь может контролировать любой аспект входного тега? (Не может ли в конечном итоге быть проще с точки зрения проверки сохранить имена входных тегов "custom_1", 'custom_2' и т. д. а затем сопоставьте их по мере необходимости.)