Forcing SSL for OpenCart: "Навязываем" защищенный протокол HTTPS

Использовать защищённый доступ к магазину через протокол SSL необходимо и важно не только с точки зрения законодательства той или иной страны (Федеральный закон РФ от 27 июля 2006 года № 152-ФЗ «О персональных данных»), но и с точки зрения собственной безопасности, когда трафик в публичных сетях постоянно прослушивается, как со стороны хакеров-любителей, так и реальных конкурентов. Особенно это актуально для точек бесплатного доступа Wi-Fi в больших городах.


В OpenCart есть соответствующая опция, отвечающая за использование протокола SSL на сайте. Разумеется сам магазин протоколом не управляет, этим занимается веб-сервер, мы всего лишь можем задать схему для ссылки (протокол HTTP или HTTPS). Опция доступна через меню панели управления (Система -> Настройки -> Магазин) в настройках магазина на закладке Сервер. Важно отметить, что "безопасный" формат ссылки не будет таковым, если не определено соответствующее значение константы HTTPS_SERVER в файле ./config.php.

"Безопасные" ссылки доступны для кабинета покупателя, аккаунта партнера и при оформлении заказа. Если пользователь переходит по ссылкам на странице, то защищенный HTTP будет определен по самой ссылке, но если пользователь перейдёт к закрытому разделу магазина через адресную строку, то он может указать адрес в укороченном виде, без схемы (или ему подменят схему в случае перехвата трафика). В OpenCart при указании адреса без схемы, протокол будет принят по умолчанию как HTTP, что недопустимо для страниц, требующих шифрования.

Чтобы решить эту проблему и сохранить максимально возможную совместимость с разными видами веб-серверов (IIS, Apache, Nginx) нам потребуется написать универсальную функцию определения SSL-соединения средствами PHP:

 public function is_ssl() {
  if ( isset($_SERVER['HTTP_SSL']) ) {
   if ( 'on' == strtolower($_SERVER['HTTP_SSL']) )
    return true;
   if ( '1' == $_SERVER['HTTP_SSL'] )
    return true;
  } elseif ( isset($_SERVER['HTTPS']) ) {
   if ( 'on' == strtolower($_SERVER['HTTPS']) )
    return true;
   if ( '1' == $_SERVER['HTTPS'] )
    return true;
  } elseif ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && ( 'https' == strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) ) ) {
   return true;
  } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
   return true;
  } elseif ( isset($_SERVER['HTTP_X_FORWARDED_PORT']) && ( '443' == $_SERVER['HTTP_X_FORWARDED_PORT'] ) ) {
   return true;
  }
  return false;
 }


Эту функцию необходимо добавить в файл ./system/library/request.php. Кстати, хорошая альтернатива для замены одноименной функции в блогах WordPress. Функция учитывает как собственные переменные веб-сервера, так и переменные, передаваемые в заголовках от прокси-сервера.

Следующую функцию необходимо поместить в файл ./system/library/url.php:

public function is_https() {
 return preg_match('/https:\/\//', $this->ssl);
}


Далее во всех файлах-контроллерах, где встречаются строки вида

if ($this->customer->isLogged()) {
     ...
    $this->redirect($this->url->link('account/login', '', 'SSL'));
}


или

if ($this->affiliate->isLogged()) {
     ...
    $this->redirect($this->url->link('affiliate/login', '', 'SSL'));
}


необходимо после добавить следующий код:

elseif ($this->url->is_https() != $this->request->is_ssl()) {
    $this->redirect($this->url->link('account/*', '', 'SSL'));
}


или

elseif ($this->url->is_https() != $this->request->is_ssl()) {
    $this->redirect($this->url->link('affiliate/*', '', 'SSL'));
}


соответственно, где * - имя файла-контроллера. Теперь нельзя будет использовать защищенный протокол, если он не включен (лишняя нагрузка на сервер при прямом наборе адреса со схемой https) и наоборот, будет перенаправление на защищенный протокол, если того требует тот или иной раздел сайта.

В Интернете есть похожие решения, но выполнены они через mod_rewrite веб-сервера Apache в файле .htaccess. Эти решения грубо говоря "прошиты" и не позволяют включать/отключать SSL через панель администрирования OpenCart.

В этой статье был затронут только защищенный протокол передачи данных, однако не стоит забывать о безопасности самого веб-сервера, в частности базы данных. Опять же, согласно Закону о персональных данных, личная информация пользователей должна храниться в зашифрованном виде, логично было бы зашифровать и информацию о заказах и финансовых транзакциях. Никто не может гарантировать, что база данных не будет использована третьими лицами без вашего согласия, например хакерами или администраторами хостинга.
Теги:
HTTPS, PHP HTTPS CHECK, PRIVACY, SAFE SHOPPING, SSL, БЕЗОПАСНОСТЬ, ДОРАБОТКА, ЗАЩИТА ПЕРСОНАЛЬНЫХ ДАННЫХ, РЕГИСТРАЦИЯ ПОЛЬЗОВАТЕЛЕЙ
Добавлено: 26 Февраля 2015 07:00:08 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...