0

現在、サーバーにSSLが含まれています。https経由のlogin-pageを使用してユーザーにログインを強制したい。

<?php

  if (empty($_SERVER['https']) || $_SERVER['https'] != 'on') {
    header('location: https://my_login_page');
    exit();
    }

  # rest of code
  ...

ただし、SSLがない場合は問題になります。

今、私は状況があります。次のURLを使用したユーザーリクエスト

http://domain.com/login.php

ここでは、にアクセスできず、$_SERVER['https']ユーザーをにリダイレクトできることを確認したい

https://domain.com/login.php

たとえば、SSL証明書はしばらくすると期限切れになり、ユーザーが安全な接続なしでログインを使用し続けることを望んでいます。

私の目標は次の例のようなものです。

if (ssl_installed() && (empty($_SERVER['https']) || $_SERVER[] != 'on')) {
  header('location: https://domain.com/login.php');
  exit();
  }

# when there's no SSL it continues using HTTP

はい、安全な接続を使用して可能な場合にssl_installed()戻る関数(例:)を記述します。それ以外の場合は。truefalse

使用してみましたが、リンクget_headers()に対して常にfalseが返されることに気付きました。https://

考えられる解決策:

私はすでに実用的な解決策を持っています。データベースの構成テーブルに行ssl=1(または0)が含まれており、データベース接続が確立された後、この値を使用してSSLを使用できるかどうかを判断し、上記の関数はこの値を使用して結果を返します。

私の質問は:もっと簡単な解決策はありますか?

明確にするために:私はPHPのみのソリューション(自動検出)を探しています!

どんな助けでもいただければ幸いです。

4

3 に答える 3

5

すべてのスクリプトを編集するのではなく、構成ファイルでこのようなことを行うことができます。

<?php

// will match /login.php and /checkout.php as examples
$force_ssl = preg_match('/\/(login|checkout)\.php(.+)?/', $_SERVER['REQUEST_URI']);
$using_ssl = (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? true : false;

$url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

if ($force_ssl && !$using_ssl) {

    // redirect to SSL
    header('Location: https://' . $url);

} elseif (!$force_ssl && $using_ssl) {

    // redirect back to normal
    header('Location: http://' . $url);

}

次に、証明書の有効期限が切れた場合は、構成ファイルでに設定$force_sslするだけfalseで、以前にリダイレクトされたすべてのスクリプトが処理されます。


質問が明確になったので、次のようなPHPスクリプトを作成できます(https://stackoverflow.com/a/4741196/654678から取得したコード)

<?php

// get and check certificate
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
$read = stream_socket_client("ssl://www.google.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
$cert = stream_context_get_params($read);

$valid = ($cert["options"]["ssl"]["peer_certificate"] != NULL) ? true : false;

// save validity in database or somewhere else accessible

次に、crontab、毎日のタスク、またはそのPHPスクリプトを毎日ヒットするものを設定します。証明書がない場合は、NULLを返し、無効としてマークされます。スクリプトで有効性を確認すれば、準備は完了です。

于 2013-02-27T09:36:45.983 に答える
1

私はあなたがhtaccessでこれを解決するかもしれないと思いますそしてこれらの2つの条件は役立つかもしれません

  • RewriteCond%{HTTP:X-Forwarded-SSL} on
  • RewriteCond%{HTTPS} on

詳細については、この回答を参照してください:https ://stackoverflow.com/a/1128624/1712686

于 2013-02-27T09:23:53.330 に答える
0
/**
 * Return true if HTTPS enabled  otherwise return false
 */
function check_ssl() {
  if ( isset( $_SERVER['HTTPS'] ) ) {
    if ( 'on' == strtolower( $_SERVER['HTTPS'] ) ) {
      return true;
    } elseif ( '1' == $_SERVER['HTTPS'] ) {
      return true;
    }
  }

  if ( isset( $_SERVER['SERVER_PORT'] )
    && ( '443' == $_SERVER['SERVER_PORT'] ) 
  ) {
    return true;
  }

  return false;
}
于 2019-03-07T09:42:13.547 に答える