6

ユーザーが安全なページを表示しているかどうかを検出し、表示していない場合はリダイレクトしたい(ログイン用)。

ただし、サーバー変数が表示される前にサイトがプロキシを経由して移動し、プロキシ(現在)は、URIが明らかにそうでないことを示している場合を通知します$_SERVER['HTTPS']'on'また'on'、ユーザーが「安全に」ナビゲートしているときも表示されます。

ナビゲートしhttp://https://両方の出力$_SERVER['SERVER_PORT']= 443

プロキシに変更を加えることができないので、知りたいのですが、

  • PHPには、真実を検出するための他のオプションがありますか...
  • 私は検出とリダイレクトのためにJavaScriptのメカニズムに頼ることに固執していますか?

私はこの質問をアイデアのために採掘しましたが、それらは主$_SERVER['HTTPS']に信頼できる変数を中心に展開しています。ああ!

この質問は少なくとも似たようなことを経験しているようですが、彼/彼はapacheソリューションを適応させることによってそれを解決することができました。

ユーザーのURIが何で始まるかを検出するために利用できる他のPHPSERVER変数またはトリックはありますか?私のサイトがhttpとhttpsで表示されたときの$_SERVER変数の唯一の違いは、次のとおりです。

  • _FCGI_X_PIPE_(ランダムに表示)
  • HTTP_COOKIE(sto-id-47873は非セキュアバージョンに含まれていますが、私はそこに入れませんでした)
  • REMOTE_ADDR(これと次の2つは不可解に変化し続けます!)
  • リモートホスト
  • REMOTE_PORT('プロキシピープル'、なぜこれを継続的に変更するのですか?)

これらのアイテムのどれかが、それが裂けて後で痛みを引き起こすことなく体重をかけるのに十分強いですか?プロキシはいつでも変更される可能性があるため、プロキシを介してフィルタリングされたものを信頼するべきではないかもしれません。

これがこの目的のためにJavaScriptを使用する私の計画です。それは私が持っている最高ですか?

function confirmSSL() {
    if(location.protocol != "https:") {
        var locale = location.href;
        locale = locale.replace(/http:\/\//,"https://");
        location.replace(locale);
    }
}
<body onLoad="confirmSSL()">...

ユーザーが私のコミュニティでJavaScriptを無効にしている場合、彼らは自分たちが何をしているのかを知っていると思います。彼らは手動で安全なゾーンに入ることができるはずです。どのような<noscript>提案がありふれた/良い習慣でしょうか?このようなもの、おそらく?:

<noscript>https://blah.more.egg/fakeを使用してナビゲートし、情報を保護します。</noscript>

(適切な説明で)機能するPHPソリューションには、正解が優先されます。より良いJavaScript実装を提出するか、JavaScript実装にリンクしてください。

どうもありがとう!

4

3 に答える 3

3

質問のコメントですでに部分的に説明されていますが、JavaScriptのリダイレクトロジックに関するいくつかの提案を要約します。

  1. 通常、window.location代わりに使用することをlocationお勧めします。説明はここにあります。
  2. 正規表現は、プロトコルを単純に置き換えるには少しやり過ぎのようです。
  3. リダイレクションの場合、追加のドキュメント処理はすべて不要であるため、リダイレクションロジックはできるだけ早く実行する必要があります。
  4. JavaScriptが無効になっているブラウザは、少なくともユーザーにhttpsへの切り替えを促す通知を表示する必要があります。

短くて効率的な次のコード(ここから採用)を使用することをお勧めします。

<head>
    <script type="text/javascript">
        if (window.location.protocol != "https:") {
            window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
        }
    </script>
    ...
</head>
<body>
    ...
    <noscript>Please click <a href="https://my-cool-secure-site.com">here</a> to use a secure connection!</noscript>
    ...
于 2013-02-07T22:14:06.430 に答える
1

クライアント側のアプローチを使用するだけです。プロキシが構成できない場合、そのオプションは無効です。jsを介した検出とリダイレクトは問題ありません。

于 2013-02-07T20:42:12.010 に答える
1

クライアント側のJavaScriptを使用せずにリダイレクトを実現する方法もあります。この方法は、クライアントのブラウザでJavaScriptが無効になっている場合に特に役立ちます。
手順は純粋なPHPであり、非常に単純です。

  • セッションを開始する
  • 新しいセッションの場合は、その場所にリダイレクトしhttpsます
  • セッションが新しくない場合は、ユーザーがリダイレクトされたと見なすことができます

コード例:

<?php
    session_start();
    if( !isset($_SESSION['runningOnHttps']) ) {
        $_SESSION['runningOnHttps'] = true;
        header('Location: https://my-cool-secure-site.com');
    }
?>

当然、一種の「ハイブリッドモード」を作成するために、JavaScriptが無効になっているブラウザにこの機能を制限することができます。非JSブラウザとの新しいセッションがあるときはいつでも、通知するある種のコールバックスクリプトにリクエストを送信します。ロケーションヘッダーを送信するサーバー:

some_landingpage.php<noscript>は、redirect.phpをロードする非表示のiframeを含むイニシャルを送信します。

if( !isset($_SESSION['checkWasMade']) ) {
    $_SESSION['checkWasMade'] = true;
    echo '<noscript>
            <iframe src="redirect.php" style="visibility: hidden; position: absolute; left: -9000px;"></iframe>
          </noscript>';
}

redirect.phpへのリクエストは、JavaScriptが無効になっていることを通知Locationし、次の実際のリクエストでヘッダー(上記を参照)を送信することでリダイレクトを強制する機会を与えます。

当然のことながら、この方法は、1つのセッション中にプロトコルが(魔法のように?)変更されない場合にのみ確実に機能します。

更新:
JavaScript以外のユーザーエージェントを処理するための上記のすべての方法は、さらに巧妙なアプローチによって無意味にレンダリングされる可能性があります。これは、タグ を介してリダイレクトできるようにする、内に含めることもできることを
学びました。<noscript><head><meta>

したがって、some_landingpage.phpは内部で最初のメタリフレッシュを送信できます<noscript>

// The following echo must appear inside the html head
if( !isset($_SESSION['checkWasMade']) ) {
   $_SESSION['checkWasMade'] = true;
   echo '<noscript>
            <meta HTTP-EQUIV="REFRESH" content="0; url=https://my-cool-secure-site.com"> 
        </noscript>';
}
于 2013-02-08T23:49:11.263 に答える