web-dev-qa-db-ja.com

inputタグ内のHTML Name属性で許可されている文字は何ですか?

PHPスクリプトを使用して<input>sを動的に生成するので、name属性の文字をフィルターする必要があるかどうか疑問に思いました。

名前は文字で始まる必要があることは知っていますが、 他のルールは知りません。 PHPは角括弧を使用してフォームデータから配列を作成するため、角括弧を許可する必要があります。括弧はどうですか?スペース?

77
DLH

フォームコントロール名に表示できる文字に関する唯一の実際の制限は、フォームがGETで送信されたときです

「「get」メソッドは、フォームデータセットの値をASCII文字に制限します。] 参照

良いスレッドがあります here

28
Allain Lalonde

フォームフィールドのname属性にすべての文字が送信されるわけではないことに注意してください(POSTを使用する場合でも)。

空白文字は削除され、内部の空白文字と文字._に置き換えられます。 (Chrome 23、Firefox 13およびInternet Explorer 9、すべてWin7でテスト済み。)

49
Matthias Samsel

[X] HTMLファイルに含めることができる任意の文字は、<input name>に入れることができます。 Allainのコメントにあるように、<input name>CDATAを含むものとして定義されているため、そこに入れることができないのは、基礎となる標準(SGMLまたはXML)が許可しない制御コードと無効なコードポイントだけです。

AllainはHTML4仕様からW3を引用しました。

注意。 「get」メソッドは、フォームデータセットの値をASCII文字に制限します。enctype= "multipart/form-data"を含む) "post"メソッドのみがISO10646文字セット全体をカバーするように指定されます。 。

しかし、これは実際には本当ではありません。

理論は、application/x-www-form-urlencodedデータにはフォームの名前または値のエンコーディングを指定するメカニズムがないため、どちらかで非ASCII文字を使用することは「指定なし」であり、POSTされたmultipart/form-data代わりに。

残念ながら、現実の世界では、multipart/form-data POSTリクエストボディのサブパートヘッダーで、理論的には可能だったとしても、ブラウザはフィールドのエンコーディングを指定しません。一度実装しますが、サーバーが壊れたためバックアウトしました。)

また、驚くほど複雑で見苦しい RFC2231 標準を実装するブラウザはありません。これは、エンコードされた非ASCIIフィールド名をマルチパートのサブパートヘッダーに挿入するために必要です。いずれにせよ、multipart/form-dataを定義するHTML仕様は、RFC2231を使用すべきであると直接述べているわけではありません。

したがって、実際の状況では、フォームの種類に関係なく、フォーム送信で名前と値に使用されているエンコーディングを知る方法はありません。非ASCII文字を含むフィールド名と値でブラウザーが行うことは、GETと両方のタイプのPOST form:使用されるフォームを含むページのエンコードを使用してエンコードします。 -ASCII GETフォーム名は、他のすべてよりも壊れていません。

DLH:

だから、名前は他の要素とは異なるデータ型を持っていますか?

実際、name属性がCDATAではない唯一の要素は<meta>です。 nameのさまざまな使用法については、HTML4仕様の 属性リスト をご覧ください。オーバーロードされた属性名であり、さまざまな要素でさまざまな意味を持っています。これは一般的に悪いことと見なされます。

ただし、最近では、フォームフィールド(コントロール名)とname(プラグイン固有のパラメーター識別子)を除き、paramを避けることが一般的です。それは取り組む2つの意味にすぎません。ページ上で<form><a>などの要素を識別するためにnameを使用することは避けてください(代わりにidを使用してください)。

38
bobince

AllainのコメントはOPの直接の質問に答え、bobinceは素晴らしい詳細な情報を提供しましたが、より具体的な質問への回答を求めて多くの人がここに来ていると思います。

この知識を検索したときにこのスレッドが最初の結果として出てきたので、見つけたものを共有することもできると思いました。

第一に、マティアスは次のように主張した。

キャラクター 。 _に置き換えられます

これは真実ではありません。ブラウザーが2013年に実際にこの種の操作を行ったかどうかはわかりませんが、そうは思いません。ブラウザはドット文字をそのまま送信します(POSTデータについて話します)!適切なブラウザの開発者ツールで確認できます。

Abluejellyによる小さなコメントに注意してください。おそらく多くの人が見逃しています:

これはサーバー固有のものであり、ブラウザのものではないことに注意してください。 Win7 FF3/3.5/31、IE5/7/8/9/10/Edge、Chrome39、およびSafari Windows 5でテストされ、それらのすべてが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」などに保ち、必要に応じてこれらをマップすることは、最終的に検証の観点から簡単ではない場合があります。)

0
John Parker