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é.
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;
}
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
}
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;
}
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;
?>
<?php
if ( !empty( $_SERVER['HTTPS'] ) ) {
//do secure stuff
}else{
//warn or redirect or whatever
}
?>
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';
}
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: