Какие символы разрешены в атрибуте HTML Name внутри тега ввода?
у меня есть php-скрипт, который будет генерировать <input>
s динамически, поэтому мне было интересно, нужно ли фильтровать любые символы в
5 ответов
обратите внимание, что не все персонажи представлены для 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' и т. д. а затем сопоставьте их по мере необходимости.)