Безопасный логин в WordPress с использованием nginx

Лишние плагины не нужны

, начиная с версии 2.6, имеет улучшенную поддержку работы с .

У администратора есть две возможности:

  1. Использование HTTPS для работы в панели управления (wp-admin).
  2. Использование HTTPS только для входа в систему.

Первое достигается путём добавления строки

[-]
View Code PHP
define('FORCE_SSL_ADMIN', true);

в wp-config.php, второе — путём добавления строки

[-]
View Code PHP
define('FORCE_SSL_LOGIN', true);

Добавляем одну из этих двух строк в wp-config.php и проблема решена? Но в действительности всё не так, как на самом деле :-)

У специалистов по информационной безопасности существует негласное правило, по которому HTML-форма, передающая данные на HTTPS-страницу, должна также находиться на HTTPS-странице. Связано это с тем, что соединение, по которому передаются данные, может прослушиваться. В случае обычного HTTP-соединения злоумышленник может модифицировать передаваемую от сервера форму, заменив https на http, что приведёт к тому, что форма будет отправлена по обычному (не зашифрованному) соединению, и злоумышленник сможет перехватить всю ценную информацию. Усугубляется это всё тем, что пользователь не может сказать, куда передаётся форма, не открыв исходный код страницы.

Для предотвращения подобного безобразия сама форма должна находиться на HTTPS-страницы: злоумышленник не сможет изменить данные, передаваемые по зашифрованному каналу.

Казалось бы, при чём тут Лужков WordPress? Во-первых, WordPress даже при включённом FORCE__LOGIN не перенаправляет пользователя с http://.../wp-login.php на https://.../wp-login.php. А во-вторых, WordPress — это не только платформа для блоггинга, это еще и CMS, на основе которой делаются всякие магазины и даже целые панели управления сайтами (да, я принимал участие в создании одной из таких панелей). Иными словами, платформы, где успешный перехват логина и пароля может привести к очень печальным последствиям.

Какие есть варианты? Самый простой — написать простой плагин, который сделает перенаправление с HTTP на HTTPS для wp-login.php. Но лишний PHP-код скорости работы не прибавляет, а потому не наш метод. Тем более, когда всё можно сделать на уровне сервера.

Рассмотрим на примере .

В nginx есть две возможности настроить HTTPS-сервер. Первая (она же наиболее часто используемая) — это задание отдельного виртуального хоста для HTTP- и HTTPS-версий сайта. Что-то вида

[-]
View Code nginx configuration
server {
    listen 80;
    server_name example.com;
#...
}

server {
    listen 443;
    server_name example.com;

    ssl on;
#...
}

В этом случае всё просто: нужно добавить следующие строки в виртуальный хост, отвечающий за HTTP:

[-]
View Code nginx configuration
location = /wp-login.php {
    rewrite .* https://example.com/wp-login.php break;
}

Вторая возможность — задать HTTP- и HTTPS-версию сайта в одном виртуальном хосте:

[-]
View Code nginx configuration
server {
    listen 80;
    listen 443 ssl;
    server_name example.com;

# Ни в коем случае нельзя задавать директиву ssl on
#...
}

В этом случае добавляемый код будет сложнее:

[-]
View Code nginx configuration
location = /wp-login.php {
    if ($ssl_protocol = "") {
        rewrite .* https://example.com/wp-login.php break;
    }

    fastcgi_pass ...;
    fastcgi_param SCRIPT_FILENAME /path/to/blog/wp-login.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_NAME /wp-login.php;
}

Очевидно, что в директивах fastcgi_xxx нужно указать свои пути.

После этого nginx будет автоматически перенаправлять посетителя с http://.../wp-login.php на https://.../wp-login.php. Таким образом и форма, и адрес отправления формы будут находиться на защищённых страницах.

Автор: ; опубликовано в: nginx, WordPress, Безопасность; метки: HTTPS, nginx, SSL, WordPress, безопасность
5
Дек
2009

RSS Комментарии к статье «Безопасный логин в WordPress с использованием nginx» (5)  »

  1. В этом случае всё просто: нужно добавить следующие строки в виртуальный хост, отвечающий за HTTPS:

    [-]
    View Code nginx configuration
    location = /wp-login.php {
        rewrite .* https://example.com/wp-login.php break;
    }

    я прав или ошибаюсь, полагая, что правильнее будет не «отвечающий за HTTPS», а «отвечающий за HTTP» ?

  2. Александр

    Все верно

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

Оставить комментарий к записи «Безопасный логин в WordPress с использованием nginx»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा