Tengo un script PHP que generará <input>
s dinámicamente, así que me preguntaba si necesitaba filtrar algún carácter en el name
atributo.
Sé que el nombre tiene que empezar con una letra, pero no conozco otras reglas. Supongo que se deben permitir los corchetes, ya que PHP los usa para crear matrices a partir de datos de formularios. ¿Qué tal los paréntesis? Espacios
name
tiene un tipo de datos diferente<input>
al que tiene para otros elementos? Interesante.<a>
y la mayoría de los elementos, pero diferente a<meta>
<input>
con todo tipo de tonterías en elname
atributo y se validó en HTML 4.01 Strict. ¡Aceptado!Tenga en cuenta que no todos los caracteres se envían para los
name
atributos de los campos de formulario (incluso cuando se usa POST).Los caracteres de espacio en blanco se recortan y los caracteres de espacio en blanco internos, así como el carácter,
.
se reemplazan por_
. (Probado en Chrome 23, Firefox 13 e Internet Explorer 9, todos Win7).fuente
first[second]
lugar defirst.second
.Cualquier carácter que pueda incluir en un archivo HTML [X] está bien para ponerlo en un
<input name>
. Como dice el comentario de Allain,<input name>
se define como que contieneCDATA
, por lo que lo único que no puede poner allí son los códigos de control y los puntos de código no válidos que el estándar subyacente (SGML o XML) no permite.Allain citó W3 de la especificación HTML4:
Sin embargo, esto no es realmente cierto en la práctica.
La teoría es que los
application/x-www-form-urlencoded
datos no tienen un mecanismo para especificar una codificación para los nombres o valores del formulario, por lo que el uso de caracteres que no sean ASCII en cualquiera de los dos "no se especifica" como funciona y debe usar POSTedmultipart/form-data
en lugar.Desafortunadamente, en el mundo real, ningún navegador especifica una codificación para los campos, incluso cuando teóricamente podría hacerlo, en los encabezados de subparte de un
multipart/form-data
cuerpo solicitud POST. (Creo que Mozilla intentó implementarlo una vez, pero se echó atrás porque rompió los servidores).Y ningún navegador implementa lo asombrosamente complejo y feo estándar RFC2231 que sería necesario para insertar nombres de campo codificados que no sean ASCII en los encabezados de las subpartes de varias partes. En cualquier caso, la especificación HTML que define
multipart/form-data
no dice directamente que se deba usar RFC2231 y, nuevamente, rompería los servidores si lo intentara.Entonces, la realidad de la situación es que no hay forma de saber qué codificación se está utilizando para los nombres y valores en el envío de un formulario, sin importar qué tipo de formulario sea. Lo que harán los navegadores con los nombres de campo y valores que contienen caracteres no ASCII es lo mismo para GET y ambos tipos de formulario POST: los codifica usando la codificación de la página que contiene el formulario utilizado. Los nombres de formularios GET que no son ASCII no están más rotos que todo lo demás.
DLH:
En realidad, el único elemento cuyo
name
atributo noCDATA
es<meta>
. Consulte la lista de atributos de la especificación HTML4 para conocer los diferentes usos dename
; es un nombre de atributo sobrecargado, que tiene muchos significados diferentes en los diferentes elementos. Esto generalmente se considera algo malo.Sin embargo, normalmente en estos días evitaría,
name
excepto en los campos de formulario (donde es un nombre de control) yparam
(donde es un identificador de parámetro específico del complemento). Eso es solo dos significados con los que lidiar. Se debe evitar el uso de la vieja escuela dename
para identificar elementos como<form>
o<a>
en la página (usarid
en su lugar).fuente
Si bien el comentario de Allain respondió la pregunta directa de OP y bobince brindó información brillante en profundidad, creo que muchas personas vienen aquí buscando una respuesta a una pregunta más específica: "¿Puedo usar un carácter de punto en el atributo de nombre de entrada del formulario?"
Como este hilo surgió como primer resultado cuando busqué este conocimiento, supuse que también podría compartir lo que encontré.
En primer lugar, Matthias afirmó que:
Esto es falso. No sé si el navegador realmente hizo este tipo de operación en 2013, aunque lo dudo. ¡Los navegadores envían caracteres de punto tal como están (hablando de datos POST)! Puede comprobarlo en las herramientas de desarrollo de cualquier navegador decente.
Por favor, observe ese pequeño comentario de abluejelly, que probablemente muchos se pierden:
Lo comprobé con el servidor HTTP Apache (v2.4.25) y, de hecho, el nombre de entrada como "foo.bar" se cambió a "foo_bar". ¡Pero en un nombre como "foo [foo.bar]" ese punto no se reemplaza por _!
Mi conclusión: puede usar puntos, pero yo no los usaría, ya que esto puede provocar algunos comportamientos inesperados según el servidor HTTP utilizado .
fuente
¿Te refieres a los atributos de identificación y nombre de la etiqueta de entrada HTML?
Si es así, me sentiría muy tentado a restringir (o convertir) los caracteres de nombre de "entrada" permitidos en solo az (AZ), 0-9 y un rango limitado de puntuación (".", ",", Etc.), aunque solo sea para limitar el potencial de ataques XSS, etc.
Además, ¿por qué dejar que el usuario controle cualquier aspecto de la etiqueta de entrada? (Puede que, en última instancia, no sea más fácil desde la perspectiva de la validación mantener los nombres de las etiquetas de entrada como 'custom_1', 'custom_2', etc. y luego asignarlos según sea necesario).
fuente