Ответ 1
Вы должны убедиться, что установлен $_SERVER['HTTPS']
, например:
if (empty($_SERVER['HTTPS'])) {
header('Location: https://mywebserver.com/login.php');
exit;
}
Есть ли способ проверить, была ли открыта текущая страница с помощью 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
}
Вы обнаружите, что это может не сработать, если вы работаете над пересылаемыми протоколами. Например, 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;
}
<?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';
}