クエリ文字列パラメーターと非表示パラメーターを含むGETフォームを送信すると表示されなくなります


231

このフォームを考えてみましょう:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

このフォーム(GETフォーム)を送信すると、パラメーターaおよびbが消えます。その理由はありますか?この動作を回避する方法はありますか?


3
アクション要素の形式が正しくありません。
エイドリアン・ゴドン

それらが消えてはならないので、あなたのフォームを見る必要があると思います。
UnkwnTech 2009

2
こんにちは、ここに完全なフォームがあります。このフォームでHTMLを作成するだけで、アクションで渡したパラメーターが表示されないことがわかります。<form action = " example.com?e=4&f=5 " method = "GET"> <input type = "hidden" name = "a" value = "1" /> <input type = "hidden" name = "b" value = "2" /> <input type = "hidden" name = "c" value = "3" /> <input type = "submit" /> </ form>

1
ところで、そのアクションの値の最後の引用符が抜けていることを知っていますか?完全にメインの問題は別として、しかし...
ジェイ

:私はここではJavaScriptを使用して可能な回避策を掲載stackoverflow.com/questions/3548795/...
ジェニー・オライリー

回答:


263

そもそも、隠しパラメータはどういうものなのでしょうか…?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

アクションURLに既存のクエリ文字列を保持しているブラウザはありません。

仕様(RFC1866、46ページ、HTML 4.xセクション17.13.3)には次のように記載されています。

メソッドが「get」でアクションがHTTP URIの場合、ユーザーエージェントはアクションの値を取得し、「?」を追加します 次に、「application / x-www-form-urlencoded」コンテンツタイプを使用してエンコードされたフォームデータセットを追加します。

おそらく、action-URLをパーセントエンコードして疑問符とパラメーターを埋め込んでから、すべてのブラウザーがそのURLをそのままにしておくことを望みます(そしてサーバーがそれも理解していることを検証します)。しかし、私はそれに依存することはありません。

ちなみに、非表示ではないフォームフィールドでも同じです。POSTの場合、アクションURLはクエリ文字列を保持できます。


71

HTML5では、これは仕様ごとの動作です。

http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithmを参照してください

「4.10.22.3フォーム送信アルゴリズム」のステップ17をご覧ください。クエリ文字列を含むhttp / s URIへのGETフォームの場合:

destinationを、アクションに等しい新しいURLにします。ただし、<query>コンポーネントはクエリに置き換えられます(必要に応じてU + 003FのQUESTION MARK文字(?)を追加します)。

したがって、ブラウザはURIの既存の「?...」部分を破棄し、フォームに基づいて新しいURIに置き換えます。

HTML 4.01では、仕様により無効なURIが生成されますが、ほとんどのブラウザーは実際にはこれを行いませんでした。

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3のステップ4を参照してください -URIには?すでに含まれている場合でも、追加されます。


?つまり、アクションURLの背後にあるすべてが削除されますか?では、アクションURLのGETパラメータに、フォームを処理する必要があるターゲットが含まれている場合はどうなるでしょうか。のように:action="index.php?site=search"。GETパラメータを非表示の入力フィールドに配置することが神の考えであるかどうかはわかりません。
Bndr 2017

仕様ごとの@xyphoidとはどういう意味ですか?
AmiNadimi、2018年

@AmiNadimi:「仕様どおり」という意味です。
再帰的

14

できることは、GET情報を含むテーブルで単純なforeachを使用することです。たとえばphpの場合:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}

23
注:このサンプルコードは、記述されているとおりに使用しないでください。非常に危険です。GETの値はユーザーから取得されるため、最初にエスケープせずにページに書き込むことはできません。
ドリュー、2014年

16
このコードのXSSバグが修正されるまで反対投票。
spookylukey 2014年

1
この回答は同様のソリューションを提供しますが、XSSに対して脆弱ではありません。
vvzh

これは配列パラメーターを処理しません
Andrew

5

2つの項目(aおよびb)をCと同様に非表示の入力要素として含める必要があります。


はい、もちろん、可能であればこれを行います。しかし、クエリ文字列と非表示の入力にパラメータがあるとしましょう。どうすればよいですか?

私の唯一の選択肢は、クエリ文字列の名前と値のペアを解析して、非表示の入力フィールドを作成することです。ページとURLのコンテキストについてもう少し詳しく説明すると、実用的な解決策を提案できるかもしれません。
Bernhard Hofmann、

または、非表示のフォームアイテムからデータを取得し、URLおよび追加のクエリパラメーターに追加してから、フォームの送信ボタンを単純なアンカーリンクに置き換えるLocation:か、エンドユーザーとのやり取りを望まない場合はサーバーリダイレクトに置き換えます。
ジェイソン

1

フォームアクションの場合、次のような非常に類似した問題がありました。

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

このボタンをクリックするとユーザーはサイトに移動しますが、クエリ情報が消えたため、ユーザーは目的のコンテンツページではなくホームページにアクセスしました。私の場合の解決策は、ユーザーを目的のページに移動させるクエリなしでURLをコーディングする方法を見つけることでした。この場合、私のターゲットはDrupalサイトでしたので、それ/content/somethingも機能しました。ノード番号(つまり/node/123)を使用することもできます。


0

回避策が必要な場合は、このフォームをサードパーティシステムに配置できるため、次のようにApache mod_rewriteを使用できます。

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

新しいフォームは次のようになります。

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

そしてApacheは3番目のパラメータをクエリに追加します


-3

あなたの建設は違法です。フォームのアクション値にパラメーターを含めることはできません。これを試すとどうなるかは、ブラウザの癖に依存します。あるブラウザで動作しても別のブラウザでは動作しなくても、私は驚かないでしょう。動作するように見えても、ブラウザーの次のバージョンで動作が変わる可能性があるため、私はそれに依存しません。

「しかし、クエリ文字列と非表示の入力にパラメータがあるとしましょう。どうすればよいですか?」あなたができることはエラーを修正することです。わくわくすることはありませんが、これは「私のURLではスラッシュではなくパーセント記号を使用しているとしましょう。どうすればよいですか?」唯一の可能な答えは、URLを修正できることです。


この全体の答えは技術的には正しいですが(「間違っているので修正してください」)、まったく役に立ちません。OPはすでに何かが間違っていることを知っており、ここでそれを修正する方法を尋ねています。
ジェイソン

すみません、分かりませんでしたか?「フォームのアクション値にパラメーターを含めることはできません。」これを修正するには、フォームのアクション値からパラメーターを削除します。
ジェイ

@Jay問題は、ユーザーがURLパラメータを維持する必要があることです。そのため、「それらを削除する」と言っても役に立たない
Chuck Le Butt

@ChuckLeButt「しかし、私は機能しないこのことをする必要がある」と言うのは、有用なことではありません。「ラジオノブを回し続けても車が動かない」と言われたら、「ラジオノブを回しても車は動かない」としか言えません。イグニッションキーを押して、アクセルペダルを踏みます。」「ラジオのつまみを回して車を動かす必要があります」という返答は非生産的です。動かない。動作しません。
ジェイ

-3

これは、Efxによる上記の投稿への応答です。

変更する変数がURLにすでに含まれている場合は、非表示フィールドとして再び追加されます。

URLで変数が重複しないようにするためのコードの変更を次に示します。

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}

-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

リクエストメソッドを「GET」ではなく「POST」に変更します。


-4

私は通常次のようなものを書きます:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

これは機能していますが、XSS攻撃に対する入力を無害化することを忘れないでください!

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