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

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

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

Related of "Используйте 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 } ?> 

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

Ну, вот еще один кусок кода. Код вернет полный 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'; }