HTMLフォームのアクション属性に空のURLを使用することは良い習慣ですか?(action =“”)


279

空のHTMLフォームアクションを使用して現在のページにポストバックすることに「ベストプラクティス」の応答をだれかができるかどうか疑問に思っています。

空白のHTMLフォームアクションがここで何をするかを尋ねる投稿がありこのようないくつかのページはそれが良いことを示唆していますが、人々がどう思うか知りたいです。


7
これに「ベストプラクティス」タグの適用を提案します。
ウィルモーガン、

二重に確認するには、アクションを空白のままにするか、アクションについてはまったく触れないでください(など<form name="xyz" >)。独自にアクションを送信します。
lwpro2

11
action属性を含めないと、攻撃者があなたのページをiframeでラップし、iframe URLにフォームフィールドと同じ名前のクエリパラメータが含まれるなど、iframeクリックジャッキング攻撃に対してページが開かれます。フォームが送信されると、クエリ値がデータベースに挿入されるため、ユーザーの識別情報(電子メール、アドレスなど)が漏洩します。
Paul Sweatte

それでは、フォームを現在のページに送信する有効で安全な方法は何でしょうか。
コスタ

回答:


268

あなたができる最善のことは、action属性を完全に省くことです。省略した場合、フォームはドキュメントのアドレス、つまり同じページに送信されます。

空のままにしておくこともできます。HTMLのフォーム送信アルゴリズムを実装するブラウザは、それをドキュメントのアドレスと同等に扱います。これは、主にブラウザが現在動作しているためです。

8.actionをsubmitter要素のactionとします。

9.actionが空の文字列の場合、actionをドキュメントのアドレスにします

注:この手順はRFC 3986の意図的な違反であり、ここではベースURL処理が必要になります。この違反の原因は、レガシーコンテンツとの互換性を求めることです。[RFC3986]

これは間違いなく、現在のすべてのブラウザで動作しますが、(一部の古いブラウザで期待どおりに動作しない場合があります」属性をブラウザが=空のアクションとの奇妙な物事を行う「理由である、)スペックは強く、それが空に残してから作家を阻止します

コンテンツの属性は、指定された場合、ある値持っている必要があります潜在的にスペースで囲まれた有効な非空のURLをactionformaction


12
おそらくこれはあなたの回答(ほぼ3年前)から変わったかもしれませんが、今日の時点ではHTML5は許可していませんaction=""。私の回答を参照してください...
derobert

2
@derobertありがとう。これはおそらく変更されていません。仕様の内容をよりよく反映するように、回答を変更しました。
メルカトル2012年

73

実際、現在のHTML5ドラフトのフォーム送信サブセクションでは許可されていませんaction=""。仕様に反しています。

コンテンツの属性は、指定された場合、有効な値は持っている必要があり、空ではない潜在的にスペースで囲まれたURLを。(強調を追加)actionformaction

中に引用されたセクションメルカトルの答えは上の要件である実装ではなく、作者。著者は著者の要件に従う必要があります。この仕様の読み方を引用するには

特に、作成者や作成者が作成したドキュメントなどのプロデューサーに適用される適合要件があり、Webブラウザーなどのコンシューマーに適用される適合要件があります。それらは、彼らが必要とするものによって区別することができます:プロデューサーの要件は何が許可されているかを示し、コンシューマーの要件はソフトウェアの動作方法を示します。

空のURLを許可していたHTML4からの変更は、「ブラウザーが空のaction=""属性で奇妙なことをする」ために行われました。変更の理由を考慮すると、HTML4でも変更しないことがおそらく最善です。


actionフォームがドキュメントのアドレスに送信する必要があることを示すために、属性が完全に存在しないようにすることはできますか?「明記されていれば」と書いてあるようです。
Kerrick

2
@Kerrickはい、HTML5ではaction属性を完全に省略でき、デフォルトで空の文字列になっていると思います。HTML4はそうではなく、必要に応じてアクションを指定します。
derobert

@Kerrickに同意します。action属性は省略できます。現在のHTML5 drafで読むと、空の文字列は許可されていないようですが、属性の不在は許可されています。ただし、いずれの場合でも、互換性の理由から、「action」属性を常に含めて、空でない有効なURLを入力することをお勧めします(適切な方法が常に最善の方法です)。
serfer2 14年

1つの潜在的な問題:AngularJSは、action属性のないフォームの送信を防ぎます。おそらく一般的な問題ではありませんが、レガシーサイトの一部が機能しなくなった理由を理解するのにしばらく時間がかかりました。
Asmor

18

action属性を含めない場合、ページはiframeクリックジャッキング攻撃にさらされます。これには、いくつかの簡単な手順が含まれます。

  • 攻撃者はあなたのページをiframeでラップします
  • iframe URLには、フォームフィールドと同じ名前のクエリパラメータが含まれています
  • フォームが送信されると、クエリ値がデータベースに挿入されます
  • ユーザーの識別情報(メール、アドレスなど)が危険にさらされている

参考文献


2
フォームは通常POSTを使用して送信されますが、iframe URLにはGETパラメーターが含まれていませんか?それで、サイトがPOSTパラメータのみを扱っている場合、それは問題ではないでしょうか?少なくとも私は通常、フォームを処理するときだけ、PHPで$ _POST配列を使用します。
Calmarius

2
@Calmariusはい、$_POST代わりに$_REQUESTを使用してこれを回避します。フレームワークコードでを使用している$_REQUEST場合は、iframeバスターを使用します。
Paul Sweatte、2015年

17

これはHTML5で検証されます。

<form action="#">

4
試したことはありませんが、概念的には、送信後にページの一番上までスクロールしませんか?
マット・ミッチェル

2
使えませんaction="."か?
s427 2013年

3
action = "?" うまくいきます。文字列データなしで検証し、現在のページをポイントします。
Chris Broski 2013

5
action="."一般的なケースでは悪い考えです。のようなURL example.com/loginは、単ににマッピングされexample.com/ます。
Torsten Bronger、2014年

1
この回答は、ユーザーがページの上部にスクロールしたい場合にのみ有効です。
Buts

9

HTML 5ではaction=""サポートされていないため、これは行わないでください。悪い習慣。

代わりに、アクションを完全に無効にして、デフォルトで同じページに送信する場合は、これがベストプラクティスであると思います。

<form>This will submit to the current page</form>

phpを使用してフォームを調停している場合は、次のことを検討してください。詳しくはこちらをご覧ください。

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

あるいは#、これはアンカーのように機能し、ページの上部にスクロールすることを覚えておいてください。

<form action="#">

誰かがこの回答に反対票を投じた理由を理解したいですか?
Buts

action属性を省略します。まだエクスプロイトが開かれているフォームの詳細は、リンクの最初のページに記載されていますか?
Richard Young

@RichardYoungごめんなさい、あなたの質問が理解できません。言い換えてください。
言い訳

1
$ _SERVER ["PHP_SELF"]変数はハッカーが使用できます。PHP_SELFがページで使用されている場合、ユーザーはスラッシュ(/)を入力してから、クロスサイトスクリプティング(XSS)コマンドを実行して実行できます。action属性を省略しても、これに対して脆弱ですか?
Richard Young

はい、そうです。action属性はクライアント側に追加して戻し、任意の値を指定できます。ただし、このhtmlspecialchars()関数を使用すると、他のユーザーがPHPスクリプトを使用できなくなります。
言い訳

4

私は通常、action = ""を使用します。これはXHTMLで有効であり、GETデータをURLに保持します。


4
めったにありませんが、たとえば、私のフォーラムでは、URL:thread.php?id = 12&page = 6があり、ページの下部にコメントを追加するためのPOSTフォームがあり、GETデータが必要なため、PHPコメントを追加するスレッドを知っています。
2009

20
GETはフォームのデフォルトのメソッドです-それは悪いことではありませ
NickFitz

5
フォーム GETを使用すること悪いことです。ユーザーが送信後にページをリロードすると、意図しない結果が生じる可能性があります。ただし、POSTが使用されている場合、ブラウザは同じデータの再送信について警告します。
シェパードは

22
@WillSheppard同意しない。あなたはそのような包括的な声明を出すことはできません。それはすべて、フォームが何をするかに依存します。アクションを実行するもの(たとえば、フォーラムへの新しい投稿の挿入)にはPOSTを使用する必要がありますが、その他のすべて(たとえば、検索ボックスやナビゲーション用のフォームの使用)にはGETを使用する必要があります。POSTが成功すると、スクリプトはブラウザをリダイレクトして、ユーザーがデータを再送信できないようにする必要があります。
Mike

3
PSすべてのブラウザがPOSTデータ(例:Opera)の再送信についてユーザーに警告するわけではありません
Mike

4

明示的にするのがベストだと思いますフォームが投稿する場所。完全に安全にしたい場合は、フォームをそれ自体に送信する場合は、action属性にフォームと同じURLを入力します。メインストリームブラウザー""は同じページに評価されますが、非メインストリームブラウザーがそうであるとは保証できません。

そしてもちろん、JuddlingのようなGETデータを含むURL全体が指摘します。


2

使うだけ

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

HTML5標準に違反していません。


私は反対投票しませんでしたが、あなたのメソッドはすべてのパラメーターをドロップしますget。次のURL example.com/update_user?user_id=1のフォームは、フォームが送信されるため壊れますexample.com/update_user?
vikki

1

Classic ASPを使用していたときに、これをよく使用していました。通常、(AJAXの時代の前に)サーバー側の検証に何らかの入力が必要なときに使用しました。私が目にする主な欠点は、プログラミングロジックがプレゼンテーションからファイルレベルで分離されないことです。


1
何故なの?接続されていないと思います。フォームで同じページにデータを投稿し、コントローラーとビューを適切に分離してこのページを作成できます。
マーカス2009

1

action属性をまったく指定していません。それは私のフレームワークが実際に設計されている方法であり、すべてのページが正確に同じアドレスに送信されます。しかし、今日私は問題を発見しました。時々私はいくつかのバックグラウンドコールをするためにアクション属性値を借ります(私はそれらをAJAXと名付けていると思います)したがって、アクション属性が指定されていない場合、IEはアクション属性値を空のままにしておくことがわかりました。action属性が指定されていない場合、対応するJavaScriptは少なくとも未定義でなければならないので、私の理解では少し奇妙です。とにかく、私のポイントは、ベストプラクティスを選択する前に、JavaScriptで属性を使用するかどうかなど、より多くのコンテキストを理解する必要があることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.