我有一个可以动态生成<input>
s 的 PHP 脚本,所以我想知道是否需要过滤name
属性中的任何字符。
我知道名字必须以字母开头,但我不知道任何其他规则。我认为必须允许使用方括号,因为 PHP 使用它们从表单数据创建数组。括号呢?空间?
我有一个可以动态生成<input>
s 的 PHP 脚本,所以我想知道是否需要过滤name
属性中的任何字符。
我知道名字必须以字母开头,但我不知道任何其他规则。我认为必须允许使用方括号,因为 PHP 使用它们从表单数据创建数组。括号呢?空间?
请注意,并非所有字符都提交给name
表单字段的属性(即使使用 POST)!
空白字符被修剪,内部空白字符以及字符.
被替换为_
. (在 Chrome 23、Firefox 13 和 Internet Explorer 9 中测试,所有版本均为 Win7。)
您可以在 [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-data
POST 请求正文的子部分标头中为字段指定编码。(我相信 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
虽然艾伦的评论确实回答了 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 服务器。
您是指 HTML 输入标签的 id 和 name 属性吗?
如果是这样,我很想将允许的“输入”名称字符限制(或转换)为仅 az(AZ)、0-9 和有限范围的标点符号(“.”、“”等),如果只是为了限制 XSS 攻击的可能性等。
此外,为什么要让用户控制输入标签的任何方面?(从验证的角度来看,保持输入标签名称为“custom_1”、“custom_2”等,然后根据需要映射它们最终可能不会更容易。)