web-dev-qa-db-fra.com

Utilisez PHP pour vérifier si la page a été accessible avec SSL

Existe-t-il un moyen de vérifier si la page actuelle a été ouverte avec SSL? Par exemple, je souhaite que ma page de connexion (login.php) vérifie si elle a été accessible via SSL (https://mywebserver.com/login.php). Sinon, redirigez-les vers la version SSL de la page.

À peu près, je tiens à ce que l'utilisateur utilise la page en toute sécurité.

35
Spidy

Vous devriez pouvoir vérifier que $_SERVER['HTTPS'] est défini, par exemple:

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

Faites attention. Sur mon IIS, $ _SERVER ['HTTPS'] n'est pas vide mais a la valeur 'off'.

Donc je devais faire

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

Vous constaterez que cela peut ne pas fonctionner si vous travaillez sur des protocoles transférés. Par exemple, l'ELB d'Amazon peut gérer la négociation SSL et interagir avec vos serveurs d'applications sur le port 80.

Ce bloc gère cela:

    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;
    }
9
Saeven

Eh bien, voici un autre morceau de code. Le code renverra l'url complète avec 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;

?>
4
Neeraj Singh
<?php
if ( !empty( $_SERVER['HTTPS'] ) ) {
  //do secure stuff
}else{
  //warn or redirect or whatever
}
?>

http://php.net/manual/en/reserved.variables.server.php

4
Farray

Juste pour ajouter qu'en cas de nginx, la façon de vérifier https est:

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

Une autre méthode consiste à vérifier l'existence de cookies HTTPS. Votre serveur doit d'abord envoyer au navigateur un cookie avec le drapeau secure:

Set-Cookie:some_key=some_value;secure

Une fois que votre serveur a envoyé le cookie au navigateur, chaque fois que le navigateur demande une page à votre serveur, il envoie le cookie sécurisé some_key=some_value uniquement si il demande une page HTTPS. Cela signifie que si vous voyez l'existence du cookie some_key=some_value vous savez que le navigateur demande une page HTTPS. Voila!

La prise en charge du navigateur est très bonne, car elle est fondamentale pour la sécurité. Les navigateurs sans prise en charge des cookies HTTPS sont Firesheepable lorsque les utilisateurs demandent des pages à partir de domaines non HSTSed.

Pour plus d'informations, voir:

2
Pacerier