我有一个将<input>
动态生成s的PHP脚本,所以我想知道是否需要过滤name
属性中的任何字符。
我知道名称必须以字母开头,但是我不知道其他任何规则。我认为必须允许使用方括号,因为PHP使用方括号从表单数据创建数组。括号呢?空格?
Answers:
请注意,并非所有字符都已提交给name
表单字段的属性(即使使用POST时也是如此)!
修剪空白字符,并用.
替换内部空白字符和该字符_
。(已在Chrome 23,Firefox 13和Internet Explorer 9(全部为Win7)中进行了测试。)
first[second]
而不是first.second
。
您可以在[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-data
POST请求正文的子部分标题中的字段指定编码。(我相信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
改用)。
尽管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服务器。
您是说HTML输入标签的id和name属性吗?
如果是这样,我很想将允许的“输入”名称字符限制(或转换)为仅az(AZ),0-9和有限范围的标点符号(“。”,“,”等),如果仅仅是为了限制XSS漏洞利用的可能性等。
另外,为什么要让用户控制输入标签的任何方面?(从验证的角度来看,保持输入标签名称分别为'custom_1','custom_2'等,然后根据需要进行映射可能并不容易。)
name
数据类型<input>
不同于其他元素吗?有趣。