Есть ли способ проверить, была ли открыта текущая страница с помощью SSL? Например, я хочу, чтобы моя страница входа (login.php) проверяла, был ли доступ к ней с помощью SSL (https://mywebserver.com/login.php). Если нет, перенаправьте их на версию SSL на странице.
В значительной степени я хочу сказать, что пользователь надежно использует страницу.
Вы должны быть в состоянии проверить, что $_SERVER['HTTPS']
установлен, например:
if (empty($_SERVER['HTTPS'])) { header('Location: https://mywebserver.com/login.php'); exit; }
Быть осторожен. На моем сервере IIS $ _SERVER ['HTTPS'] не пуст, но имеет значение «off».
Так что я должен был сделать
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != 'on') { // no SSL request }
Вы обнаружите, что это может не сработать, если вы работаете над пересылаемыми протоколами. Например, ELB Amazon может обрабатывать 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; }
<?php if ( !empty( $_SERVER['HTTPS'] ) ) { //do secure stuff }else{ //warn or redirect or whatever } ?>
Ну, вот еще один кусок кода. Код вернет полный 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; ?>
Другой метод – проверить наличие файлов 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.
Для получения дополнительной информации см .:
Просто добавьте, что в случае nginx способ проверки https:
if (isset($_SERVER['SERVER_PORT']) && ($_SERVER['SERVER_PORT'] === '443')) { return 'https'; }