Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Форум Общие вопросы Безопасность Переход на HTTPS старых версий Diafan CMS (5.4 и ниже)


Любимов Павел (DIAFAN.CMS) 33403 сентября 2017 г., редакция 26 апреля, пятница

Специально публикую материал в публичной части форума и пишу более подробно, чтобы он смог оказаться полезным большему числу пользователей, интересующихся данным вопросом.
Критика и дополнения приветствуются.


Дополнено 20.10.2017

С каждым годом требования перехода сайтов на протокол HTTPS перетекают из области рекомендации в область обязательных к исполнению. Сайты на HTTP уже помечаются как небезопасные и далее этот процесс будет только ужесточаться. Для сайтов, разработанных на актуальной версии CMS никаких проблем не возникнет - нужно будет купить сертификат, либо установить бесплатный и всё. Внутри CMS версии 6.0 и выше процедура определения протокола уже отлажена.

А вот со старыми версиями CMS всё несколько сложнее. Там миграция на HTTPS посредством только лишь покупки SSL-сертификата может вызвать целый ряд проблем. А учитывая, что достаточно большое количество проектов, выполненных на 5.4 и ниже, были тем или иным способом доработаны, обновить их в автоматическом режиме не представляется возможным. Да и в ручном это сделать далеко не всегда просто.

Поэтому самый оптимальный вариант решения вопроса - ручное обновление файлов, в которых есть код, отвечающий за формирование URL. Техническая поддержка даёт по этому вопросу следующую информацию:
Цитата
В актуальной версии DIAFAN.CMS протокол соединения подставляется автоматически. Поэтому как таковых правок не требуется. Однако для полной уверенности следует пройтись автоматическим поиском по всем файлам сайта. Например, в файлах административной части cms присутствуют ссылки без автоматической подстановки протокола.

В целом, данная цитата лишь в малой степени проливает свет на то, с чем придётся столкнуться, что всё-таки делать и с чего начинать. Простой поиск по фразе "http" в файлах системы выявит более 150 000 совпадений и картина от этого яснее не станет.



ПРОЦЕДУРА ОБНОВЛЕНИЯ ФАЙЛОВ
Основное отличие версий 5.4 и 6.0 можно отследить в файле index.php, посмотрев процедуру определения константы BASE_PATH:

Diafan 5.4
Код
define('BASE_PATH', "http".(! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '')."://".getenv("HTTP_HOST")."/".(REVATIVE_PATH ? REVATIVE_PATH.'/' : ''));
Diafan 6.0
Код
define('BASE_PATH', "http".(IS_HTTPS ? "s" : '')."://".getenv("HTTP_HOST")."/".(REVATIVE_PATH ? REVATIVE_PATH.'/' : ''));

Как видно из примеров выше, основное отличие в использовании в старых версиях глобальной переменной $_SERVER['HTTPS'], а в новых версиях - константы IS_HTTPS, которая определяется выше в файле index.php:
Код
define('IS_HTTPS', (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' || ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || isset($_SERVER['HTTP_X_HTTPS']) && $_SERVER['HTTP_X_HTTPS'] == '1'));

Основных файлов, где данный код нужно поправить - три. Это
  1. /index.php (пользовательская часть)
  2. /adm/includes/init.php (админ-панель)
  3. /themes/functions/show_head.php (определение $this->diafan->_site->canonical)
Разумеется, файлов несколько больше и во избежании возможных проблем найти и поправить желательно всё.
Строки, в которых фигурирует $_SERVER['HTTPS'], не идентичны. Например в файле init.php можно встретить:
Код
define('BASE_PATH', "http".(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '')."://".getenv("HTTP_HOST")."/".( REVATIVE_PATH ? REVATIVE_PATH.'/' : '' ) );
Код
define('BASE_PATH_HREF', "http".(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '')."://".getenv("HTTP_HOST")."/".( REVATIVE_PATH ? REVATIVE_PATH.'/' : '' ).ADMIN_FOLDER.'/'.$row["shortname"].'/' );

Поэтому основной упор нужно делать на поиск глобальной переменной $_SERVER['HTTPS'], который даст уже куда более чёткое представление о том, что и в каких файлах править.



В найденных файлах нужно заменить этот участок кода (для версии 5.4):
Код
.(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? "s" : '').
на этот:
Код
.(IS_HTTPS ? "s" : '').

В более старых версия CMS код отличается от представленного выше (для 5.4). Смотрите как объявляется константа BASE_PATH в файле index.php. Из этого станет понятно - что искать. Но чаще всего там будет использована та же $_SERVER['HTTPS'].

Чтобы новый код работал корректно, следует в файл index.php перед определением BASE_PATH добавить определение константы IS_HTTPS:
Код
define('IS_HTTPS', (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' || ! empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' || isset($_SERVER['HTTP_X_HTTPS']) && $_SERVER['HTTP_X_HTTPS'] == '1'));

Онлайн Софт (Onmaster) 8103 сентября 2017 г.

Цитата
нужно будет купить сертификат
, не «нужно», а «можно». У нас вот их можно, например, получить без покупки.

Код
и всё
, не всё, ещё чуть-чуть перенастроить хостинг.

И в актуальной версии CMS не всё и не автоматически. Насколько я знаю, есть проблема кэша, которая может доставлять неприятности, если не настроено автоматическое перенаправление с http на https протокол. CMS может кэшировать url с http и выдавать их пришедшим по https, чем браузеры могут быть недовольны почти так же как и при посещении сайта по http, а может даже и больше, ведь основной url по https и что то вдруг тут же проскакивает по http.

Если это не так и ситуация исправилась, успокойте меня :)

А в общем и целом мы всё же актуальность, в том числе и CMS, с пониманием того как всё не просто с обновлением :)
Спасибо сказали: Сергей Сеов (sergey-seov)

Любимов Павел (DIAFAN.CMS) 33403 сентября 2017 г., редакция 05 февраля

Цитата
ещё чуть-чуть перенастроить хостинг.
Хостер, предоставляющий услугу хостинга и в подавляющем большинстве случаев продающий сертификат, как правило сам его устанавливает и настраивает.

Правильное замечание про кэш. Действительно, закэшированное по HTTP содержимое не перекэшируется при обращении по HTTPS. При этом браузер выдаст предупреждение о небезопасном содержимом пользователю, которое его разумеется насторожит.

Поэтому после окончания всех процедур следует сделать редирект с протокола HTTP на HTTPS через файл .htaccess (если у вас Apache):
Код
# Перенаправление на HTTPS
RewriteCond %{HTTPS} =off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]

# Исключение из редиректа robots.txt
RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC]

Файл robots.txt по требованию поисковых систем нужно из правила редиректа исключить (запись выше).

Отмечу также, что не стоит торопиться и сразу ставить редирект после установки сертификата и правки файлов, поскольку Яндекс в таком случае исключит старое основное зеркало сайта и из-за редиректа не сможет создать новое. Подробнее об этом можно почитать у Платона Щукина.

А протестировать как встал сертификат можно при помощи этого сервиса: SSL Server Test.

Онлайн Софт (Onmaster) 8103 сентября 2017 г.

Хороший сервис ;) протестил наш демо сайт с бесплатным сертификатом, показал A+.

Сергей Сеов (sergey-seov) 125 сентября 2017 г.

Код
# Перенаправление на HTTPS
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.sajt.ru/$1 [R=301,L]

# Исключение из редиректа robots.txt
RewriteCond %{REQUEST_FILENAME} robots.txt$ [NC]


всё отлично работает НО

Не подскажите редирект с https://www на https:// - (301 с www на без www с протоколом https )

Любимов Павел (DIAFAN.CMS) 33426 сентября 2017 г., редакция 26 сентября 2017 г.

Так добавьте дополнительную запись для редиректа с www. Она в htaccess Diafan присутствует, да и в интернете найти не проблема:
Код
RewriteCond %{HTTP_HOST} ^www.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Спасибо сказали: Сергей Сеов (sergey-seov)

Сергей Сеов (sergey-seov) 125 сентября 2017 г.

Здравствуйте, решили diafan 5.1 перевести на https и конечно же наткнулись на проблемы

главная заработала а вот админка нет, судя по теме нужно внести изменения в init.php
Но вот беда не вижу похожего кода в этом файле
Содержимое у нас следующее

1 часть кода
Код
define( 'BASE_PATH', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) );

require_once(ABSOLUTE_PATH.'plugins/IDNA.php');
$IDN = new idna_convert(array('idn_version' => '2008'));
$domain = $IDN->decode($_SERVER["HTTP_HOST"]);
define('BASE_URL', ($domain ? $domain : $_SERVER["HTTP_HOST"]) . ( REVATIVE_PATH ? '/' . REVATIVE_PATH : '' ) );


2 часть

Код
if ($rew[0] == $row["shortname"] && ! $row["base_admin"])
{
$_GET["rewrite"] = preg_replace('/^' . $rew[0] . '(\/)*/', '', $_GET["rewrite"]);
define( '_LANG', $row["id"]);
define( '_SHORTNAME', $row["shortname"] . '/' );
define( 'TITLE', ( defined('TIT' . $row["id"]) ? constant('TIT' . $row["id"]) : '' ) );
define( 'BASE_PATH_HREF', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) . ADMIN_FOLDER . '/' . $row["shortname"] . '/' );
break;
}
}

Показать весь код
}
if (!defined('_LANG'))
{
foreach ($this->languages as $row)
{
if ($row["base_admin"])
{
define( '_LANG', $row["id"]);
define( '_SHORTNAME', '' );
define( 'TITLE', ( defined('TIT' . $row["id"]) ? constant('TIT' . $row["id"]) : '' ) );
define( 'BASE_PATH_HREF', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) . ADMIN_FOLDER . '/' );
break;
}
}
}
}


Пробывали менять с HTTP на HTTPS без изменений

Надеюсь всё что нужно зацепил из кода

Любимов Павел (DIAFAN.CMS) 33426 сентября 2017 г., редакция 26 сентября 2017 г.

Ищите в папке сайта текстовым поиском все совпадения $_SERVER["HTTP_HOST"], т.к. они в вашем случае участвуют в формировании ссылки. Смотрите строки, где формирование ссылки есть. Меняйте везде, а не только в init.php.

Сначала смотрите что у вас в index.php. Отсюда понимаете что искать. Ищете в остальных файлах. Я порядка 20 правок вносил.
Спасибо сказали: Сергей Сеов (sergey-seov)

Сергей Сеов (sergey-seov) 126 сентября 2017 г.

На что в моём случае менять? Мне вот это не особо понятно(((

Это
Код
$_SERVER["HTTP_HOST"]


на это?
Код
(IS_HTTPS ? "s" : '')

Спасибо сказали: Андрей (R4W)

Denis (Drachoon) 14426 сентября 2017 г., редакция 26 сентября 2017 г.

$_SERVER["HTTP_HOST"] хранит значение HTTP_HOST
(IS_HTTPS ? "s" : '') конструкция которая добавляете букву s если константа IS_HTTPS = true

То есть
Код
"http" . (IS_HTTPS ? "s" : '') . "://".<доменное имя (переменная или где оно хранится) > . "?" . <плюс прочие атрибуты если таковые имеются>


Если применимо к этой строке
Код
define( 'BASE_PATH', "http://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) );

то получается вот так
Код
define( 'BASE_PATH', "http" . (IS_HTTPS ? "s" : '') . "://" . $_SERVER["HTTP_HOST"] . "/" . ( REVATIVE_PATH ? REVATIVE_PATH . '/' : '' ) );

Спасибо сказали: Станислав (krishtafovichs)

Андрей (R4W) 7926 сентября 2017 г.

А сайт сильно перепилен, что обновится до свежей версии представляется опасным?
Светаните ссылочку

Любимов Павел (DIAFAN.CMS) 33426 сентября 2017 г., редакция 26 сентября 2017 г.

Денис, IS_HTTPS объявляется и определяется в index.php. Причём, насколько я знаю, только начиная с 6-ой версии. В более старых её надо самостоятельно объявлять.

Любимов Павел (DIAFAN.CMS) 33426 сентября 2017 г., редакция 26 сентября 2017 г.

Цитата
На что в моём случае менять? Мне вот это не особо понятно(((
Если без лишних исправлений/добавлений, то менять надо это: "http://" . $_SERVER["HTTP_HOST"] на это "https://" . $_SERVER["HTTP_HOST"]

Владимир (Chemist) 220 июня 2018 г.

Читал, читал, да и не понял, на версии 5.0 что поправить, чтобы с админкой всё нормально было? Она грузится, но все картинки и разметка слетают. Речь о доступе к админе по https.

Виталий NVGPRO (DIAFAN.CMS) 32721 июня 2018 г.

Обновите cms до актуальной версии. Этого будет достаточно.

Любимов Павел (DIAFAN.CMS) 33421 июня 2018 г.

Виталий, если бы это было так просто для большинства аудитории, я бы эту статью не писал.

Любимов Павел (DIAFAN.CMS) 33421 июня 2018 г., редакция 21 июня 2018 г.

Открывайте index.php в корне сайта и смотрите как там реализовано формирование константы:
Смотрите как объявляется константа BASE_PATH в файле index.php. Из этого станет понятно - что искать.
Ну и исходя из этого ищете фрагмент кода в основных файлах сайта, а при желании во всех. Лучше поискать везде.

Но если выше написанное Вам плохо понятно, то из этого следует, что задача эта для специалиста, которого, видимо, требуется нанять.