我有一个PHP脚本,将动态生成<input>
s,所以我想知道是否需要过滤name
属性中的任何字符。输入标签内的HTML名称属性允许使用哪些字符?
我知道名字必须以字母开头,但我不知道任何其他规则。我想方括号必须被允许,因为PHP使用这些来从表单数据创建数组。圆括号怎么样?空间?
我有一个PHP脚本,将动态生成<input>
s,所以我想知道是否需要过滤name
属性中的任何字符。输入标签内的HTML名称属性允许使用哪些字符?
我知道名字必须以字母开头,但我不知道任何其他规则。我想方括号必须被允许,因为PHP使用这些来从表单数据创建数组。圆括号怎么样?空间?
您是否指HTML输入标记的id和name属性?
如果是这样,我很想将允许的“输入”名称字符限制(或转换)为只有az(AZ),0-9和有限范围的标点符号(“。”,“,”等等),如果只是为了限制XSS漏洞利用的潜力等。
此外,为什么让用户控制输入标签的任何方面? (从验证的角度来看,保持输入标签名称为'custom_1','custom_2'等等可能最终并不容易,然后根据需要映射这些名称。)
我可能不会让我的名字像这样产生。我只是想通过让我的办公室中技术含量较低的成员指定表单字段的方式进行思考。 – DLH 2010-08-06 14:59:40
@DLH我会受到诱惑(以消除名称冲突的风险等),只是像上面的中间方法。 :-) – 2010-08-06 15:00:56
任何可以包含在[X] HTML文件中的字符都可以放入<input name>
。正如Allain的评论所说,<input name>
被定义为包含CDATA
,因此您唯一不能放入的东西是底层标准(SGML或XML)禁止的控制代码和无效代码点。
阿兰引述W3从HTML4规范:
注意。 “get”方法将表单数据集值限制为ASCII字符。仅指定“post”方法(使用enctype =“multipart/form-data”)来覆盖整个ISO10646字符集。
然而这在实践中并不真实。
该理论认为application/x-www-form-urlencoded
数据没有一个机制来指定表单的名称或值的编码,所以在使用中“未指定”要么非ASCII字符的工作,你应该使用POST方法multipart/form-data
代替。
不幸的是,在现实世界中,即使理论上可以,在POST请求主体的子部分标题中,没有浏览器指定字段的编码。 (我认为Mozilla的尝试,一旦实施,但退出了,因为它打破了服务器。)
和浏览器实现了惊人的复杂和丑陋RFC2231标准,有必要将经编码的非ASCII字段名成多的子部分头。无论如何,定义multipart/form-data
的HTML规范并不直接指出应该使用RFC2231,并且,如果尝试了,它将再次破坏服务器。
因此,情况的真实情况是无法知道表单提交中的名称和值使用的编码是什么,无论它是什么类型的表单。浏览器对包含非ASCII字符的字段名称和值所做的操作与GET和两种类型的POST表单相同:它使用包含所用表单的页面的编码对它们进行编码。非ASCII的GET表单名称不会比其他所有表单都更糟。
DLH:
所以名字有比它对于其他元素不同的数据类型?
实际上的唯一元素,其name
属性不CDATA
是<meta>
。对于name
的所有不同用途,请参阅HTML4规范的attribute list;它是一个超载的属性名称,在不同的元素上有许多不同的含义。这通常被认为是一件坏事。
但是,通常现在您会避免name
,除了表单字段(它是控件名称)和param
(它是插件特定的参数标识符)。这只是两个意思。应该避免在页面上使用name
来识别像<form>
或<a>
这样的元素(改为使用id
)。
请注意,并非所有字符都提交了name
表单字段的属性(即使在使用POST时)!
将空白字符剪裁并将内部空白字符以及字符.
替换为_
。 (测试在Chrome 23,Firefox的13和Internet Explorer 9,所有的Win7。)
尽管阿兰的评论并回答OP的直接问题,bobince提供了一些精彩深入的信息,我相信很多人来这里寻找答案更多具体问题:“我可以在表单的输入名称属性中使用点字符吗?”
由于此线程作为第一个结果,当我搜索这些知识时,我猜我可能分享我发现的东西。
首先,马蒂亚斯声称:
字符。被替换为_
这是不真实的。我不知道浏览器在2013年是否真的做过这种操作 - 但我怀疑这一点。浏览器照原样发送点字符(在讨论POST数据)!你可以在任何体面的浏览器的开发工具中检查它。
请注意,由abluejelly小小的评论,这可能是由许多错过:
我想指出,这是一个特定于服务器的事情,而不是浏览器的东西。在Win7 FF3/3.5/31,IE5/7/8/9/10/Edge,Chrome39和Safari Windows 5上进行测试,并且所有人都在POST中发送“test this.stuff”(四个前导空格)与VS2012捆绑在一起的ASP.NET开发服务器。
我用Apache HTTP服务器(v2.4.25)检查过它,实际上输入名称如“foo.bar”更改为“foo_bar”。但是在一个像“foo [foo.bar]”这样的名称中,该点不会被_替换!
我的结论:您可以使用点但我不会使用它,因为这可能会导致一些意外的行为,具体取决于使用的HTTP服务器。
因此'name'对于''具有不同于其他元素的数据类型?有趣。 – DLH 2010-08-06 15:18:27
这与''和大多数元素相同,但不同于'' – Alohci 2010-08-06 15:22:30
是的。刚刚在'name'属性中尝试了'',并且在HTML 4.01 Strict中进行了验证。公认! – DLH 2010-08-06 15:29:50