input标签内的HTML名称属性允许使用哪些字符?

我有一个PHP脚本,将dynamic生成<input> s,所以我想知道是否需要过滤name属性中的任何字符。

我知道这个名字必须以一封信开始,但我不知道其他规则。 我想方括号必须被允许,因为PHP使用这些从表单数据创build数组。 圆括号怎么样? 空间?

什么字符可以出现在窗体控件名称的唯一真正的限制是当表单提交与GET

“get”方法将表单数据集值限制为ASCII字符。“ 参考

这里有一个很好的线程。

请注意,并不是所有的字符都被提交给表单字段的name属性(即使使用POST)!

空白字符被剪裁,内部空白字符以及angular色._replace。 (在Chrome 23,Firefox 13和Internet Explorer 9中testing,都是Win7。)

任何可以包含在[X] HTML文件中的字符都可以放在<input name> 。 正如Allain的评论所说, <input name>被定义为包含CDATA ,因此唯一不能放在那里的是底层标准(SGML或XML)所不允许的控制代码和无效代码点。

Allain引用了HTML4规范中的W3:

注意。 “get”方法将表单数据集值限制为ASCII字符。 仅指定“post”方法(使用enctype =“multipart / form-data”)来覆盖整个ISO10646字符集。

然而这在实践中并不真实。

理论上, application/x-www-form-urlencoded数据没有指定表单的名称或值的编码的机制,所以使用非ASCII字符中的“未指定”作为工作,你应该使用改为发布multipart/form-data

不幸的是,在现实世界中,即使在理论上可能的情况下,在multipart/form-data POST请求主体的子部分标题中,没有浏览器指定字段的编码。 (我相信Mozilla曾试图实现它,但是因为它破坏了服务器而退出)。

并且没有浏览器实现令人惊讶的复杂和丑陋的RFC2231标准,这将需要插入编码的非ASCII字段名称到多部分的子部分标题。 在任何情况下,定义multipart/form-data的HTML规范并不直接说RFC2231应该被使用,并且如果你尝试了,它将再次破坏服务器。

所以现实情况是无法知道表单提交中用于名称和值的编码是什么,不pipe是什么types的表单。 对于包含非ASCII字符的字段名称和值,浏览器所做的与GET和两种types的POST表单相同:它使用包含所用表单的页面的编码对它们进行编码。 非ASCII的GET表单名称不会比其他任何事情都更糟糕。

DLH:

所以名称与其他元素有不同的数据types?

其实name属性不是CDATA的唯一元素是<meta> 。 有关name所有不同用途,请参阅HTML4规范的属性列表 ; 它是一个超载的属性名称,在不同的元素上有许多不同的含义。 这通常被认为是一件坏事。

但是,通常这些日子里,除了表单字段(它是一个控件名称)和param (它是插件特定的参数标识符)之外,您将避免使用name 。 这只是两个意思。 应该避免使用旧name来标识页面上的<form><a>元素(使用id代替)。

虽然Allain的评论确实回答了OP的直接问题,而且Bobince提供了一些精彩的深入信息,但我相信很多人来到这里寻求更具体的问题的答案:“我可以在表单的input名称属性中使用点字符吗?

当我寻找这些知识的时候,当这个线索成为第一个结果时,我猜我可能会分享我发现的东西。

首先,马提亚斯声称:

性格。 被_replace

这是不真实的。 我不知道浏览器是否真的在2013年做过这种操作 – 但是,我怀疑这一点。 浏览器发送点字符原样(谈论POST数据)! 你可以在任何体面的浏览器的开发工具中检查它。

请注意,由abluejelly小小的评论,这可能是错过了很多:

我想指出,这是一个服务器特定的东西,而不是浏览器的东西。 在Win7 FF3 / 3.5 / 31,IE5 / 7/8/9/10 / Edge,Chrome39和Safari Windows 5上testing,所有这些在POST中发送“test this.stuff”(四个前导空格)与VS2012捆绑在一起的ASP.NET开发服务器。

我用Apache HTTP服务器(v2.4.25)检查了它,实际上input名称如“foo.bar”更改为“foo_bar”。 但是在“foo [foo.bar]”这个名字中,这个点不会被_replace!

我的结论是: 你可以使用点,但我不会使用它,因为这可能会导致一些意外的行为取决于使用的HTTP服务器

你的意思是HTMLinput标签的id和name属性?

如果是这样的话,我会非常想将允许的“input”名称字符限制(或转换)为只有az(AZ),0-9和有限范围的标点符号(“。”,“,”等),如果只是为了限制XSS漏洞的可能性等等

另外,为什么让用户控制input标签的任何方面? (从validation的angular度来看,保持input标签名称为'custom_1','custom_2'等等,最终并不容易,然后根据需要映射它们。)