Используйте PHP для проверки доступа к странице с помощью SSL

Есть ли способ проверить, была ли открыта текущая страница с помощью SSL? Например, я хочу, чтобы моя страница входа (login.php) проверяла, был ли доступ к ней с помощью SSL (https://mywebserver.com/login.php). Если нет, перенаправляйте их на версию SSL на странице.

В значительной степени я хочу сказать, что пользователь надежно использует страницу.

Ответ 1

Вы должны убедиться, что установлен $_SERVER['HTTPS'], например:

if (empty($_SERVER['HTTPS'])) {
    header('Location: https://mywebserver.com/login.php');
    exit;
}

Ответ 2

Будьте осторожны. На моем сервере IIS $_SERVER ['HTTPS'] не пуст, но имеет значение "off".

Так что мне пришлось делать

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') {
    // no SSL request
}

Ответ 3

Вы обнаружите, что это может не сработать, если вы работаете над пересылаемыми протоколами. Например, Amazon ELB может обрабатывать SSL-переговоры и взаимодействовать с серверами приложений по порту 80.

Этот блок обрабатывает:

    public function isSSL()
    {
        if( !empty( $_SERVER['https'] ) )
            return true;

        if( !empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' )
            return true;

        return false;
    }

Ответ 5

Ну, вот еще один кусок кода. Код вернет полный URL-адрес с помощью https/http.

<?php

/**
 * Check whether URL is HTTPS/HTTP
 * @return boolean [description]
 */
function isSecure()
{

    if (
        ( ! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
        || ( ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
        || ( ! empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)
        || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443)
        || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https')
    ) {
        return true;
    } else {
        return false;
    }

}
/**
 * Example Use
 */
define('APP_URL', (isSecure() ? 'https' : 'http') . "://{$_SERVER['SERVER_NAME']}".str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']));
echo APP_URL;


/**
 * +++++++++++++++++++++++++
 * OR - One line Code
 * +++++++++++++++++++++++++
 */
define('APP_URL', ((( ! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || ( ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || ( ! empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') || (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) || (isset($_SERVER['HTTP_X_FORWARDED_PORT']) && $_SERVER['HTTP_X_FORWARDED_PORT'] == 443) || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https') ) ? 'https' : 'http') . "://{$_SERVER['SERVER_NAME']}".str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']));
echo APP_URL;

?>

Ответ 6

Другим методом является проверка наличия файлов cookie HTTPS. Сначала ваш сервер должен отправить браузеру cookie с флагом secure:

Set-Cookie:some_key=some_value;secure

После того, как ваш сервер отправил браузер в файл cookie, всякий раз, когда браузер запрашивает страницу с вашего сервера, он отправит безопасный файл cookie some_key=some_value , только если запрашивает страницу HTTPS. Это означает, что если вы видите существование файла cookie some_key=some_value, вы знаете, что браузер запрашивает страницу HTTPS. Вуаля!

Поддержка браузера очень хороша, так как это имеет фундаментальное значение для безопасности. Браузеры без поддержки файлов cookie HTTPS Firesheepable, когда пользователи запрашивают страницы из доменов, отличных от HSTSed.

Для получения дополнительной информации см.:

Ответ 7

Просто добавьте, что в случае nginx способ проверить https:

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