5

ログインフォームがあります:

<form method =POST action="/login.php">
...
</form>

login.phpを使用してページをリダイレクトしたいと思いますhttps

https://.../login.phpユーザーがリンクを変更する可能性があるため、ユーザーを送信したくありません。しかし、ログインフォームデータを解析してユーザーをログインさせる前に、サーバー側でリダイレクトを行いたい.

私が見つけた例:

if($_SERVER["HTTPS"] != "on") {
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]);
   exit();
}

$_SERVER["HTTPS"]しかし、もし私が持っていないvar_dump($_SERVER);

私は$_SERVER['SERVER_PORT']魔女が 80 を持っています。

何か案は?

ありがとう

4

4 に答える 4

6

プレーンHTTP経由で/login.phpに投稿してからHTTPSにリダイレクトすることを許可すると、ログイン情報がすでにインターネット経由でプレーンテキストで送信されているため、HTTPSを使用する目的が無効になります。

ユーザーがURLを変更できないようにするためにできることは、HTTPS経由でない場合にログインページがログインを拒否するようにすることです。

HTTPSの使用を確認するために使用するのは次のとおりです。

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) {
    // request is not using SSL, redirect to https, or fail
}

セキュアサーバーをデフォルトのポート443で実行している場合は、それがポートであるかどうかを確認することもできますが、$_SERVER['HTTPS']SSLが使用されている場合、PHPは値を空以外に設定するため、ベストプラクティス。

編集:

ユーザーがhttpsをhttpに手動で変更するように含まれていて、プレーンテキストで情報を送信したい場合、ユーザーを停止するためにできることは何もありませんが、HTTPを介したログインを許可しない場合は、正しい情報でも送信されません。ログインすると、httpsを唯一の機能にすることで、httpsを使用するように強制できます。

于 2012-02-03T20:55:43.177 に答える
5

ログインフォームの表示に使用するページは、フォームに入力するhttps:// 前にすでに使用されている必要があります。その後、別のhttps://アドレスに送信する必要があります。それ以外の場合は、フォームを開いたままにして攻撃します。

mod_rewriteを調べて、少なくともログインページに対して、を使用http://してリクエストを自動的にリダイレクトできます。https://

于 2012-02-03T20:58:46.043 に答える
3

ログインフォームを含むページがによって生成されたと仮定すると、index.phpHTTPからHTTPSへのリダイレクトのサンプルコードをに入れる必要がありますindex.php。これにより、ユーザーがフォームに入力して送信するときに、/login.phpHTTPではなくHTTPS経由で送信されるようになります。

このチェックを中に入れるのlogin.phpは無駄です。なぜならlogin.php、リクエストを取得して対応するHTTPS URLにリダイレクトしようとするときまでに、クレデンシャルはすでにプレーンテキストとして送信されているため、避ける必要があります。

チェックを中に入れたときに設定されていないこと$_SERVER['SERVER_PORT']がわかるという観察結果は、ログインクレデンシャルがHTTP経由で送信されているため、ログインクレデンシャルが暗号化されていないクライアントからサーバーに到達していることをさらに証明しています。これは、この回答の最初の段落で私が言ったことに従うことによって回避する必要があります。80$_SERVER["HTTPS"]login.php

ところで、私はこの種のリダイレクトを行うためにPHPを使用しません。mod_rewriteこのようなリダイレクトは、ApacheHTTPDで非常に便利に処理されます。

例として、ログインページが次のURLで利用可能であると仮定します。http: //example.com/foo/

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^foo/$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
于 2012-02-03T21:01:08.683 に答える