1

アプリケーションでHTTPクライアントを強制的にHTTPSに切り替えたい。入力するユーザーwww.mysite.comはデフォルトでHTTPを使用しますが、HTTPSにリダイレクトする必要があります。古いブックマークを使用しているユーザーは、ブックマークされたページのHTTPSバージョンにリダイレクトされます。

HSTS(RFC 6797)は、リダイレクトされると非常に役立ちます。私の質問は実際にはHTTPメソッドについてです。

GETそしてHEAD確かに301/302リダイレクトを受け入れることになっていますが、POST/PUTとはDELETEどうですか?

次の例を参照してください。

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;

        if (context.Request.IsSecureConnection) return;

        if (context.Request.HttpMethod == "GET" || context.Request.HttpMethod == "HEAD")
        {
            string redirectUri = context.Request.Url.ToString().Replace("http://", "https://");
            context.Response.RedirectPermanent(redirectUri, true);
        }
        else
        {
            throw new HttpException(403, "SSL Required");
        }
    }

GETとHEADの両方がリダイレクトで処理されます。現在、POSTは、私が知る限り、実行されるGET要求として301リダイレクトを受け入れます。つまり、HTTPSバージョンに再投稿しません。これが、私のコードスニペットで403コードになってしまう理由です。

質問は、HTTPプロトコルの観点から読む必要があります

アプリケーション内のすべてのフォームがHTTPSを指していることを確認する以外に、ブラウザが要求をプレーンな古いHTTPバージョンに転送するときに、賢いHTTP開発者がクライアントにPOST要求をページのHTTPSバージョンにリダイレクトするように強制する必要がありますか?

考えられる解決策

すべてのフォームフィールドで埋められたランディングページを作成します。これにより、自動的に(Javascriptと[リダイレクトされない場合はクリックしてください]ボタンを使用して)フォームがターゲットページのHTTPSバージョンに再投稿されます。

他のアイデアはありますか?

4

2 に答える 2

2

元々、301および302応答は、POST要求が適切にリダイレクトされるように、要求メソッドと要求本体を保持することを目的としていました。ただし、実際には、ほとんどすべてのWebブラウザーがそれらを実装しているため、要求メソッドはに変更されています。これGETは、通常、それが必要なためです。

303と307がHTTP/1.1で導入されたのは、そのためです。303は文字通り、リクエストメソッドをに切り替える必要があることを意味しますがGET、307はメソッドが保持されることを明示的に示しているため、おそらく307が必要です。ただし、私は307を何にも使用したことがないため、どれだけうまくいくかはわかりません。ブラウザや他のユーザーエージェント間で機能します。

しかし、これを必要以上に大きな問題にしているのではないでしょうか。誰かがPOSTリクエストをブックマークできるわけではありません。

于 2012-12-30T16:11:06.040 に答える
2

リダイレクト時のPOSTの動作は、サーバーから返されたステータスコードによって異なります。さらに、多くのブラウザはPost / Redirect / Getパターンを実装していますが、これはHTTP仕様に完全には準拠していない可能性があります。

これは言われています:

  • 一般的にリダイレクトに依存することは避けてください。(この回答を参照してください。)本番環境でリダイレクトを使用することは必ずしも悪いことではありませんが、ロケーションバーに直接アドレスを入力するユーザーにとってはそうです。とにかくリダイレ​​クトが行われるとき、MITMが存在しないという仮定に依存しています。潜在的な問題を隠すため、開発段階でのリダイレクトは悪いと思います。

  • POST(またはURLに機密情報を含むGET)でのリダイレクトに依存しないでください。最初の要求(HTTPSへのリダイレクト前)はとにかくクリアに送信されるため、HTTPSを使用しようとする目的が無効になります。

HTTPSを使用する場合は、指定するリンクとフォームのターゲットURLがを使用していることを確認してくださいhttps://。また、可能であれば、ユーザーがHTTPSの使用を期待していることを確認してください。ユーザーだけがそれを確認できます。

Eugeneがコメントで言っていたように、フォームがHTTPS経由で提供されるランディングページも用意することをお勧めします。

古いブックマークを使用してこのページにアクセスするユーザーを主に懸念しているように思われるため、POSTとDELETEは関係ありません。いずれにせよ、ユーザーはブックマークからGETを使用します。可能であれば、ブックマークを更新するように伝えます。また、ブラウザが覚えておく必要のあるHSTSまたは301(永続的なリダイレクト)を使用することもできます。これによりhttps://、キャッシュがクリアされない限り、アドレスが次に使用されるときに直接移動します。

于 2012-12-30T17:19:46.640 に答える