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


82

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

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

Answers:


28

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

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

有一个关于它良好的线程在这里


那么name数据类型<input>不同于其他元素吗?有趣。
DLH 2010年

<a>与大多数元素相同,但与<meta>
Alohci

4
是的 刚刚尝试了<input>name属性中使用各种废话的方法,并在HTML 4.01 Strict中进行了验证。公认!
DLH 2010年

Twitter使用这类名字,什么特别的理由让一些进阶用户...... [USER_PASSWORD],用户[邮件]
维沙尔·夏尔马

“对表单控件名称中可以显示的字符的唯一真正限制是使用GET提交表单时的限制” —否。这并不限制名称中可以显示的字符,仅意味着转换时必须对其进行URL编码到一个URL。
Quentin

53

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

修剪空白字符,并用.替换内部空白字符和该字符_。(已在Chrome 23,Firefox 13和Internet Explorer 9(全部为Win7)中进行了测试。)


11
谢谢您添加此通知,朋友。我正准备开始使用进行编码。作为分隔符。
戴维斯·佩索托

1
根据此页面,内部空格由加号(+)代替:w3schools.com/tags/tryit.asp?
filename=tryhtml_form_submit

1
我第二个@Dave。对于那些在想同样事情的人,您可能正在寻找数组样式的输入:first[second]而不是first.second
JD

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

3
请参阅下面的@Aleksander的评论。某些服务器可能会转换为“。” 到“ _”,但在浏览器中没有发生。
杰夫·洛里

38

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

Allain在HTML4规范中引用了W3:

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

但是,实际上这并不是真的。

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

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

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

因此,这种情况的现实是,无论表单是哪种类型,都无法知道表单提交中的名称和值使用了哪种编码。浏览器将对包含非ASCII字符的字段名称和值执行的操作与GET和两种POST表单类型相同:它将使用包含所用表单的页面的编码对它们进行编码。非ASCII GET表单名称不会比其他所有名称更残破。

DLH:

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

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

但是,通常这几天通常会避免name使用表单字段(控件名称)和param(特定于插件的参数标识符)表单字段。这只是要解决的两个意思。应避免过时地使用name来标识类似<form><a>页面上的元素(id改用)。


9

尽管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”(四个前导空格)发送给了与VS2012捆绑在一起的ASP.NET开发服务器。

我使用Apache HTTP服务器(v2.4.25)进行了检查,实际上输入名称(如“ foo.bar”)已更改为“ foo_bar”。但是,在“ foo [foo.bar]”之类的名称中,点不能被_代替!

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


怎么了?如果我使用name =“ foo bar”。
等于

0

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

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

另外,为什么要让用户控制输入标签的任何方面?(从验证的角度来看,保持输入标签名称分别为'custom_1','custom_2'等,然后根据需要进行映射可能并不容易。)


我可能最终不会像这样生成我的名字。我只是在尝试思考允许我办公室中技术水平较低的成员指定表单字段的方法。
DLH 2010年

@DLH我很想(以消除名称冲突的风险,等等)只是上述一种中间方法。:-)
约翰·帕克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.