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

У меня есть PHP script, который будет генерировать <input> динамически, поэтому мне было интересно, нужно ли мне фильтровать любые символы в атрибуте name.

Я знаю, что имя должно начинаться с буквы, но Я не знаю никаких других правил. Я считаю, квадратные скобки должны быть разрешены, так как PHP использует их для создания массивов из данных формы. Как насчет круглых скобок? Пространства?

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Allain цитирует W3 из спецификации HTML4:

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

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

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

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

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

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

DLH:

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

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

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

Ответ 4

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

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

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

. заменены на _

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

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

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

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

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

Ответ 5

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

Если это так, у меня возникнет соблазн ограничить (или преобразовать) допустимые "вводные" имена символов только в az (AZ), 0-9 и ограниченный диапазон знаков препинания ( ".", "," и т.д..), если только для ограничения возможностей для эксплойтов XSS и т.д.

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