web-dev-qa-db-ja.com

POSTリクエストでリダイレクトする良い方法は?

POSTリクエストでユーザーを外部サイトにリダイレクトする必要があります。

私が考え出した唯一のオプションは、JavaScriptを介してフォームを送信することです。


何か案は?

19
RadiantHex

それが何を意味するのかはっきりしないので、いくつかのシナリオを考えてみましょう:

  1. ユーザーは自分以外のサーバーにPOSTフォームを送信する必要があります

    簡単です。フォームアクションとしてターゲットを指定するだけです。

    <form action="http://someotherserver.com" method="post">
    
  2. POST submitが成功した後、ユーザーをリダイレクトする必要があります

    簡単で、通常どおりPOSTデータを受け入れて処理し、302または303リダイレクトヘッダーで応答します。

  3. ユーザーはサーバーにデータをPOST送信し、検証後、そのデータを別のサーバーにPOST送信する必要があります

    少しトリッキーですが、3つのオプション:

    • サーバーはPOSTデータを受け入れ、ユーザーが応答を待つ間に別のサーバーへの接続を確立し、データをPOSTして応答を受信し、ユーザーに応答を返します。
    • 307リダイレクトで応答します。これは、ユーザーが別のアドレスで同じリクエストを試行する必要があることを意味します。理論的には、ブラウザが同じデータを別のサーバーにPOST送信する必要があることを意味します。これがどれほどサポートされているかはよくわかりませんが、HTTP1.1を理解しているブラウザであれば実行できるはずです。 AFAIAは、実際にはあまり使用されていません。
      PS:仕様によると、307 POSTリダイレクトは、少なくともユーザーが確認する必要があります。悲しいかな、どうやらここでは仕様に固執するブラウザはありません。 IEはリクエストを繰り返すだけで(目的に合わせて機能します)、Firefox、Safari、およびOperaはPOSTデータを破棄するようです。したがって、この手法は残念ながら信頼できません。
    • 隠しフォームフィールドと組み合わせた手法#1を使用して、間に1つのステップを追加します。

すべてのHTTPリダイレクトオプションのリストについては、ここを参照してください。 http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

34
deceze

HTMLフォームのアクションURLを特定の外部サイトに設定するだけです。

これが [〜#〜] sscce [〜#〜] です。コピーして貼り付けて実行するだけです。

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2604530</title>
    </head>
    <body>
        <form action="http://stackoverflow.com/questions/2604530/answer/submit" method="post">
            <textarea name="post-text"></textarea>
            <input type="submit" value="Post Your Answer">
        </form>
    </body>
</html>

Stackoverflowが優れたCSRF保護を備えていることがわかります;)

5
BalusC

JavaScriptが唯一の方法です(自動的に実行するため)。標準のPOSTメソッドを介してhttpリクエストをリダイレクトすることはできません。 GETがここでのオプションではないことを確信していますか?

2
Wolph

リンク、HTTPリダイレクト、および<meta http-equiv="refresh" >としてフォームを使用することがおそらく唯一のオプションです。ブラウザは[〜#〜] get [〜#〜]メソッドを使用して別のURLをロードするだけです。

ただし、フォームを送信するために必ずしもJavaScriptを使用する必要はありません。何らかのユーザー操作が許容できる場合は、いくつかの<input type="hidden">フィールドを含むフォームを使用して、ユーザーが送信ボタンを押すようにできます。

また、リダイレクト先のページがGETパラメータを受け入れていないことを確認することもできます。 一部のスクリプト GETとPOSTの両方を無差別に受け入れます。

0
Alex Jasmin