輸入標籤內的HTML Name屬性允許使用哪些字符?



html input textarea (4)

任何可以包含在[X] HTML文件中的字符都可以放入<input name> 。 正如Allain的評論所說, <input name>被定義為包含CDATA ,因此您唯一不能放入的東西就是底層標準(SGML或XML)所不允許的控制代碼和無效代碼點。

Allain引用了HTML4規範中的W3:

注意。 “get”方法將表單數據集值限制為ASCII字符。 僅指定“post”方法(使用enctype =“multipart / form-data”)來覆蓋整個ISO10646字符集。

然而這在實踐中並不真實。

理論是application/x-www-form-urlencoded數據沒有指定表單的名稱或值的編碼的機制,因此在任何一個中使用非ASCII字符時都是“未指定”,因此您應該使用改為發布multipart/form-data

不幸的是,在現實世界中,即使在理論上可能的情況下,瀏覽器也不會在字段的multipart/form-data POST請求主體的子部分標題中指定字段的編碼。 (我相信Mozilla試圖實施一次,但是因為它破壞了服務器而退出了。)

並且沒有瀏覽器實現令人驚訝的複雜和醜陋的RFC2231標準,這將需要將編碼的非ASCII字段名稱插入到多部分的子部分標題中。 無論如何,定義multipart/form-data的HTML規範並不直接說RFC2231應該被使用,並且如果你嘗試了,它會再次破壞服務器。

因此,情況的實際情況是無法知道表單提交中的名稱和值使用的編碼是什麼,無論它是什麼類型的表單。 瀏覽器對包含非ASCII字符的字段名稱和值所做的操作與GET和兩種類型的POST表單相同:它使用包含所用表單的頁面的編碼對它們進行編碼。 非ASCII的GET表單名稱不會比其他所有表單都更糟。

DLH:

所以名稱與其他元素有不同的數據類型?

實際上,其name屬性不是CDATA的唯一元素是<meta> 。 有關name所有不同用途,請參閱HTML4規範的屬性列表 ; 它是一個超載的屬性名稱,在不同的元素上有許多不同的含義。 這通常被認為是一件壞事。

但是,通常這些日子裡,除了表單字段(它是控件名稱)和param (它是插件特定的參數標識符)之外,您將避免使用name 。 這只是兩個意思。 應該避免使用舊name來標識頁面上的<form><a>元素(使用id代替)。

我有一個動態生成<input> s的PHP腳本,所以我想知道是否需要過濾name屬性中的任何字符。

我知道這個名字必須以一封信開頭,但我不知道任何其他規則。 我想方括號必須被允許,因為PHP使用這些來從表單數據創建數組。 圓括號怎麼樣? 空間?


Answer #1

請注意,並非所有字符都是為表單字段的name屬性提交的(即使使用POST)!

空白字符被剪裁,內部空白字符以及角色._替換。 (經過Chrome 23,Firefox 13和Internet Explorer 9測試,全部為Win7。)


Answer #2

你的意思是HTML輸入標籤的id和name屬性?

如果是這樣,我會非常想將限制(或轉換)允許的“輸入”名稱字符僅限於az(AZ),0-9和有限範圍的標點符號(“。”,“,”等),如果只是為了限制XSS漏洞利用的潛力等。

另外,為什麼讓用戶控制輸入標籤的任何方面? (從驗證的角度來看,保持輸入標籤名稱為'custom_1','custom_2'等等,然後根據需要映射這些名稱可能最終並不容易。)


Answer #3

儘管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-input