* 提出 (Web Forms) [1] [[フォーム]]を[DFN[[RUBYB[提出] [submit]]]]すると、 [[成功]]制御子の[[制御子名]]と[[現在値]]の組が[[フォーム処理エージェント]]に渡されます。 [SRC[HTML 4 17.2, 17.13]] [2] 仕様書: - [[HTML 4]] ([[Web Forms 1.0]]) -- [CITE[17.13 Form submission]] - [[Web Forms 2.0]] -- [CSECTION@en[1.12. Security]] [[#comment]] ** 提出処理の流れ [4] フォームの提出は、次の手順を経ます。 [SRC[HTML 4 17.13.3]] :1. 成功制御子の識別:[[フォーム]]内の制御子から、[[成功]]しているものを選びます。 :2. フォーム・データ集合の構築:成功制御子から、[DFN[[[フォーム・データ集合]]]] ([[制御子名]]と[[現在値]]の組の集合) を構築します。 :3. フォーム・データ集合の符号化:フォーム・データ集合を指定された[[媒体型]] ([CODE(HTMLa)[[[enctype]]]]) により符号化します。 :4. 符号化フォーム・データ集合の提出:符号化したデータ集合を指定された[[フォーム処理エージェント]] ([CODE(HTMLa)[[[action]]]]) に指定された方法 ([CODE(HTMLa)[[[method]]]]) で送信します。 :(5. 結果のレンダリング):UA は、提出の際の HTTP [CODE(HTTP)[[[GET]]]]・[CODE(HTTP)[[[POST]]]] に対する応答をレンダリングするべきです。 [5] >>4 で、提出されるのがフォーム・データ集合 (名前と現在値の組の集合) だけのように書かれていますが、 ファイル選択制御子の場合はそれに含まれないはずのファイルの内容も提出されます。 画像提出ボタン ([[[CODE(HTMLe)[input]]//[CODE(HTML)[image]]]]) の座標との関係も不明確で、概念の整理が不十分という印象を受けます。 [6] なお、 >>4 の流れは、4つの段階を完全に別のものとして扱えるわけではなく、 制御子の種類, 媒体型, 処理エージェントのプロトコルなどの依存関係があります。 仕様や実装によって実際に使用できる組合せは限られてきます。 >>7 をご覧ください。 [9] 文章入力制御子の入力長制御を完全に行えないなど、環境の事情によっては提出の際に [CODE(HTMLa)[[[maxlength]]]] 属性に基づく検査が必要かもしれません。 (UA の実装方法によっては、[[初期値]]が [CODE(HTMLa)[maxlength]] を満たさない場合やスクリプトによる変更があった場合にも注意が必要です。) ([[名無しさん]]) [[#comment]] ** 提出方法 [7] HTML 4 が[Q[確立された慣習]]として対応することを要求している [SRC[HTML 4 17.13.3, 17.13.4]] のは、次の場合だけです。 ,[CODE(HTMLa)[action]] ,[CODE(HTMLa)[method]] ,[CODE(HTMLa)[enctype]] ,その他 ,[[HTTP]] URI ,[CODE(HTML)[[[get]]]] ,[CODE(MIME)[[[application/x-www-form-urlencoded]]]] ,フォーム・データは ASCII 文字のみ ,HTTP URI ,[CODE(HTML)[[[post]]]] ,[CODE(MIME)[[[application/x-www-form-urlencoded]]]] ,フォーム・データは ASCII 文字のみ ,HTTP URI ,[CODE(HTML)[[[post]]]] ,[CODE(MIME)[[[multipart/form-data]]]] これも含めて、様々な組合せが利用されています。 使用例のある URI scheme: - [CODE(URI)[[[http]]:]] (HTTP) - [CODE(URI)[[[https]]:]] (HTTP over [[TLS]]) - [CODE(URI)[[[file]]:]] (ファイル) - [CODE(URI)[[[mailto]]:]] (電子メイル) - [CODE(URI)[[[data]]:]] (データ) - [CODE(URI)[[[ftp]]:]] ([[FTP]]) - [CODE(URI)[[[sms]]:]] ([[SMS]]) - [CODE(URI)[[[smsto]]:]] ([[SMS]]) - [CODE(URI)[[[javascript]]:]] ([[ECMAScript]]) - [CODE(URI)[[[device]]:]] (装置) - [CODE(URI)@en[[[location]]:]] ([[位置情報]]付き [[HTTP]]) 使用例のある媒体型: - [CODE(MIME)[[[application/x-www-form-urlencoded]]]] - [CODE(MIME)[[[application/sgml-form-urlencoded]]]] - [CODE(MIME)[[[application/x-www-form+xml]]]] - [CODE(MIME)[[[text/plain]]]] - [CODE(MIME)[[[multipart/form-data]]]] - [CODE(MIME)[[[application/vnd.wap.multipart.form-data]]]] - [11] [CODE(MIME)[[[application/vnd.wap.wml.form.urlencode]]]] [[#comment]] ** 安全性 [14] [[フォーム]]の[[提出]]機能が濫用され、 [[利用者]]に第3者を攻撃させるために使われることがあります。 例えば、 [[SMTP]] [[鯖]]を[[提出]]先とし、 [[提出]]により[[利用者]]が気づかない間に [[spam]] が[[送信]]されてしまうことがあるかもしれません。 [[SMTP]] や [[telnet]] などよく知られた[[フォーム]][[提出]]には使われない[[プロトコル]]の[[ポート]]番号が[[提出]]先に指定されている時には、 [[提出]]を制限することが勧められています。 [SRC@en[WF2 1.12]] [15] >Certain actions, including submitting a form to a third-party site and making HTTP GET requests to remote sites (both of which would be blind attacks, assuming the UA implements a cross-domain scripting security mechanism) have been historically allowed, and many sites depend on these features for quite legitimate uses. User agents should allow them. > Servers therefore must also consider security. Servers should never perform non-idempotent actions in response to GET requests, as discussed by the HTTP specification. Servers should also check the Referer header to ensure that only requests from trusted hosts are honoured. > Servers should also consider the client to be untrusted, since in most scenarios requests can be made to hosts by hostile parties directly, bypassing any security logic included in the page nominally intended to perform the submission. Thus servers should perform validation on all submitted data, whether such validation is expected to be performed on the client or not. [SRC@en[WF2 1.12]] [[#comment]] ** 実装 [8] [WEAK[2003-10-12 12:52:32 +00:00]] ''[[名無しさん]]'': 手元の [Q[Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624]] で試してみたら、 [CODE(HTMLa)[[[enctype]]]] は [CODE(MIME)[[[application/x-www-form-urlencoded]]]] と [CODE(MIME)[[[text/plain]]]] と [CODE(MIME)[[[multipart/form-data]]]] に対応していましたが、[[引数]]をつけたら全滅でした。 [2] >>1 [[WinIE 6]] と Win[[Opera]] 7.20 でも同様でした。但し Opera は [CODE(MIME)[text/plain]] に対応していない模様。 [[#comment]] ** メモ [3] フォームの[Q[提出]] ([Q[submit]]) は、意味を解して[Q[送信]]とも呼ばれます。 しかしながら、提出と送信ではニュアンスが異なりますから、 専門用語としては使い分けるべきでしょう。 [10] [[WAP 2.0]] は [[XHTML m12n]] + α ですが、 追加の属性の関係でフォーム処理の方法を修正しています。 [12] [[ヘブライ語]]が含まれるかもしれない時に [CODE(HTML)[[[get]]]] を [CODE(HTMLa)[[[method]]]] に使うのは非推奨です。 - [[SI 4281]]:1998 -- [CSECTION[8.1 Encoding the reply]] [13] [[提出]]先[[URI]] ([CODE(HTMLa)@en[[[action]]]] [[URI]]) に既に[CODE(URI)@en[?]]が含まれているにもかかわらず[[提出]]方法が[[HTTP]] [CODE(HTML)@en[[[get]]]]の場合どうするかについて、 - [[HTML 4]]には規定がありません。 - [[Web Forms 2.0]]と実際の[[Webブラウザ]]は[CODE(URI)@en[?]]以後を切り落とした上で[[フォーム・データ集合]]から生成したものを付け足します。 - [[XForms 1.0]]はそのままの[[URI]]に、[CODE(URI)@en[&]]と[[フォーム・データ集合]]から生成したものを付け足します。 [[Web Forms 2.0]]の方法は、[[相対URI参照]]を使ってもどんどん[CODE(ABNF)@en[[[query]]]]が長くなっていく虞が無いという利点があります。 [CITE@en[Re: Compatibility between HTML, XForms, and WSDL from Ian Hickson on 2005-03-21 (www-forms-editor@w3.org from March 2005)]] [16] [CITE[公開メモ日記 - IEのフォームでsubmitボタンの値が送信されるかどうか]] ([[名無しさん]] [WEAK[2006-07-18 12:02:21 +00:00]]) [17] [CITE[Form Submission by Pressing the Enter Key]] [CITE[Form Submission by Pressing the Enter Key]] [18] [CITE[Web Forms 2.0]] [19] >>16-18 [[WinIE 6]] では、[[テキスト入力制御子]]で [KEY@en[[[Enter]]]] を押すと、 - [[テキスト入力制御子]]が[[フォーム]]内に1つなら、 [[提出]][[ボタン]]を押して''いない''として[[提出]] - [[テキスト入力制御子]]が[[フォーム]]内に2つ以上なら、 [[提出]][[ボタン]]を押し''た''として[[提出]] [[Firefox 1.5]] と [[Opera 8]] では、どちらも押し''た''として[[提出]] ([[名無しさん]] [WEAK[2006-07-18 12:05:24 +00:00]]) [[#comment]] * メモ