92

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

我知道名字必须以字母开头,但我不知道任何其他规则。我认为必须允许使用方括号,因为 PHP 使用它们从表单数据创建数组。括号呢?空间?

4

5 回答 5

59

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

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

于 2012-12-13T11:15:41.430 回答
39

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

Alllain 引用了 HTML4 规范中的 W3:

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

然而,这在实践中并不是真的。

理论是application/x-www-form-urlencoded数据没有为表单的名称或值指定编码的机制,因此在任何一个中使用非 ASCII 字符都“未指定”为有效,您应该使用 POSTedmultipart/form-data代替。

不幸的是,在现实世界中,即使理论上可以,也没有浏览器在multipart/form-dataPOST 请求正文的子部分标头中为字段指定编码。(我相信 Mozilla 曾经尝试过实现它,但因为它破坏了服务器而退出了。)

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

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

DLH:

那么 name 的数据类型与其他元素的数据类型不同吗?

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

但是,通常这些天您会避免name使用表单字段(它是控件名称)和param(它是插件特定的参数标识符)。这只是要解决的两个含义。应避免使用老式的name用于标识页面上的元素(如<form>或)(改为使用)。<a>id

于 2010-08-06T15:47:02.830 回答
32

表单控件名称中可以出现哪些字符的唯一真正限制是使用 GET 提交表单时

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

这里有一个很好的线程。

于 2010-08-06T14:56:20.170 回答
9

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

当我搜索这个知识时,这个线程作为第一个结果出现,我猜我也可以分享我发现的东西。

首先,Matthias 声称:

特点 。被_取代

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

请注意 abluejelly 的那条小小的评论,可能很多人都错过了:

我想指出这是特定于服务器的事情,而不是浏览器的事情。在 Win7 FF3/3.5/31、IE5/7/8/9/10/Edge、Chrome39 和 Safari Windows 5 上测试,它们都将“test this.stuff”(四个前导空格)作为 POST 中的名称发送到与 VS2012 捆绑的 ASP.NET 开发服务器。

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

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

于 2017-03-19T20:05:39.630 回答
0

您是指 HTML 输入标签的 id 和 name 属性吗?

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

此外,为什么要让用户控制输入标签的任何方面?(从验证的角度来看,保持输入标签名称为“custom_1”、“custom_2”等,然后根据需要映射它们最终可能不会更容易。)

于 2010-08-06T14:49:58.313 回答