输入标记内的HTML Name属性允许使用哪些字符?

时间:2010-08-06 14:43:20

标签: html html-form web-standards html-input

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

我知道名字必须以字母开头,但是我不知道其他任何规则。我想方括号必须允许,因为PHP使用这些来从表单数据创建数组。括号怎么样?空间?

5 个答案:

答案 0 :(得分:49)

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

修剪了空白字符,内部空白字符以及.字符被_替换。 (在Chrome 23,Firefox 13和Internet Explorer 9中测试,所有Win7。)

答案 1 :(得分:37)

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

Allain引用了HTML4规范中的W3:

  

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

然而,在实践中并非如此。

理论上,application/x-www-form-urlencoded数据没有为表单的名称或值指定编码的机制,因此在任何一个中使用非ASCII字符都是“未指定”工作,你应该使用POSTed而是multipart/form-data

不幸的是,在现实世界中,没有浏览器在multipart/form-data POST请求正文的子部分标题中指定字段的编码,即使理论上也可以。 (我相信Mozilla试图实现它一次,但在它破坏了服务器时退出了。)

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

所以情况的实际情况是无法知道表单提交中的名称和值使用什么编码,无论它是什么类型的表单。对于GET和两种类型的POST表单,哪些浏览器对字段名称和包含非ASCII字符的值的处理方式相同:它使用包含所用表单的页面的编码对它们进行编码。非ASCII GET表单名称不会比其他所有名称都破坏。

DLH:

  

因此,name与其他元素的数据类型不同?

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

但是,通常这些天你会避免name,除了表单字段(它是控件名称)和param(它是一个特定于插件的参数标识符)。这只是要解决的两个含义。应避免使用name老式使用<form>来识别网页上的<a>id等元素(请改用{{1}})。

答案 2 :(得分:28)

对表单控件名称中出现的字符的唯一真正限制是使用GET

提交表单时

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

它有一个很好的主题here

答案 3 :(得分:7)

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

当我搜索这些知识时,当第一个结果出现时,我想我也可以分享我发现的内容。

首先,马蒂亚斯声称:

  

字符。被_

取代

这是不真实的。我不知道浏览器是否真的在2013年做过这种操作 - 不过,我对此表示怀疑。浏览器按原样发送点字符(谈论POST数据)!你可以在任何像样的浏览器的开发者工具中查看它。

请注意abluejelly的那个小小的评论,很可能被许多人遗漏:

  

我想说明这是服务器特定的事情,而不是浏览器。在Win7 FF3 / 3.5 / 31,IE5 / 7/8/9/10 / Edge,Chrome39和Safari Windows 5上进行测试,所有这些都在POST中发送了“test this.stuff”(四个前导空格)作为名称ASP.NET开发服务器与VS2012捆绑在一起。

我使用Apache HTTP服务器(v2.4.25)进行了检查,确实输入的名称如“foo.bar”更改为“foo_bar”。但是像“foo [foo.bar]”这样的名称,这个点不会被_!

取代

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

答案 4 :(得分:0)

您的意思是HTML输入标记的id和name属性吗?

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

此外,为什么让用户控制输入标签的任何方面? (从验证的角度来看,最好不要让输入标签名称为'custom_1','custom_2'等,然后根据需要对它们进行映射。)