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



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

574   5  

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

таким образом, реальность ситуации заключается в том, что нет способа узнать, какая кодировка используется для имен и значений в представлении формы, независимо от того, какая это форма. То, что браузеры будут делать с именами полей и значениями, содержащими символы, отличные от ASCII, одинаково для GET и обоих типов формы POST: он кодирует их с помощью кодировки страницы, содержащей используемую форму. Не-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.бар " изменяется на "foo_bar". Но в таком названии, как " фу[фу.бар]" эта точка не заменяется _!

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

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

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

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

Comments

    Ничего не найдено.