WordPress как на ладони
wordpress jino

Ограничиваем количество попыток авторизоваться в обход WordPress

Сначала я заметил на своих сайтах, потом в twitter прочел несколько сообщений, что сейчас на WordPress блоги идут массовые брутфорс атаки: китайские боты пароли перебирают, посылая POST запросы на файл wp-login.php.

Оглавление:

Проблема не в том, что сайт могут взломать, ведь есть плагины для ограничения количество попыток авторизоваться: Limit Login Attempts, а в том, что WordPress движок "тяжелый" и такие запросы создают чрезмерную нагрузку на сервер. Происходит это потому что для работы плагина нужна среда WordPress, файл wp-load.php, а при её загрузке делается много вычислений, прежде чем плагин начинает работать. Добавьте сюда по 20 запросов в секунду и вы поймете как не легко приходится серверу...

Kama WP Limit Login

Мой хостинг начал ругаться на завышенные нагрузки. Мне нужна была защита и я написал небольшой PHP скрипт, предварительно назвав его "kama_wp_limit_login". Он ограничивает попытки авторизации до 3 в течении часа. Вся прелесть в том, что код работает сам по себе, а значит в обход WordPress: сначала проверяется IP и последнее время "входящего", если все ОК, то WordPress работает как обычно, если нет - работа PHP прерывается и выводится сообщение.

Установка Kama WP Limit Login

Кama Wp Limit Login ver 3.4
Скачано: 29, размер: 2.3 KB, дата: 4 месяца назад
  1. Залейте папку из архива _kama_wp_limit_login в корень вашего сайта, туда где лежит wp-config.php.

  2. Установите права 755 на папку cache, чтобы сервер мог создавать и изменять файлы в этой папке. На некоторых серверах такие права установлены по умолчанию.

  3. Откройте файл wp-config.php и в самое начало, после <?php, вставьте такую строчку:

    require __DIR__ . '/_kama_wp_limit_login/main.php';
  4. Готово!

Осталось проверить: нужно неправильно авторизоваться 3 раза. Через 3 попытки вы должны увидеть сообщение о блокировке.

Немного лирики

Это не плагин WordPress и поэтому подключается скрипт необычно.

-

Если у вас несколько сайтов на одном хосте, то можно найти родительскую директорию для всех сайтов и разместите папку _kama_wp_limit_login туда. А для каждого сайта в wp-config.php указать подобный код, вместо приведенного выше:

require __DIR__ . '/../../_kama_wp_limit_login/main.php';

где ../../ означает что папка _kama_wp_limit_login лежит на 2 директории выше, файлов wp-config.php ваших сайтов.

-

Этот скрипт по сути можно подключить к любому сайту, не только к WordPress.

Успехов!

Обновления

Версия 3.4 (12.07.2017)

  • Добавил файл .htaccess в основную папку, чтобы к ней не было внешнего доступа.

Версия 3.3 (10.03.2017)

  • Мелкие правки кода, небольшое изменение логики.
  • Теперь REQUEST_URI не добавляется в название файла по умолчанию, но это можно изменить в опциях.
  • Изменил название папки скрипта с kama_limit_login на _kama_wp_limit_login. - нужен чтобы папка как-то отличалась от остальных и была вверху. Название можно поменять (работа скрипта от него не зависит), только при этом не забудьте поменять строку вызова скрипта...

Версия 3.0 (09.03.2017) - улучшил логику, защиту от атак и убрал php заметки которые выскакивали в прошлых версиях.

Версия 1.1 (23.12.2014) - добавил папку cache в которую создаются временные файлы. До этого файлы создавались вместе с основным файлом main.php.

Защита с помощью .htaccess + .htpasswd

Другой вариант защиты - это установка пароля на сервере для доступа к файлу wp-login.php.

Принцип работы заключается в том, что при заходе на страницу wp-login.php пользователю будет показано дополнительное окно авторизации, в которое нужно ввести пароль для доступа к wp-login.php (как выглядит окно зависит от браузера).

login-w

Если пароль введен верно, то сервер допускает вас к файлу и далее как обычно можно авторизоваться в самом WordPress.

Порядок действий:

Шаг 1: создаем файл .htpasswd

В корне вашего сайта создаем файл, в котором указываем логи и пароль для доступа. Можно указать несколько логинов и паролей для разных пользователей:

kama:$apr1$Q9Gnetdv$pZyL9sGbN3ynC4k2oAZaQ.
andreas:$apr1$dHjB0/..$mkTTbqwpK/0h/rz4ZeN8M0
john:$apr1$IHaD0/..$N9ne/Bqnh8.MyOtvKU56j1

Пользователей можно вписать сколько угодно. Для генератора таких строк используйте специальные сервисы, например этот.

Шаг 2: Подключаем файл .htpasswd

Открываем файл .htaccess, который должен быть рядом с только что созданным .htpasswd и добавляем в него такой код (в любое место):

<Files wp-login.php>
AuthName "Access Denied"
AuthType Basic
AuthUserFile /home/www/site.ru/.htpasswd
require valid-user
</Files>

Не забудьте поменять путь до файла к /home/www/site.ru

Готово! Теперь попробуйте авторизоваться в WordPress. И вы уведите дополнительное окно для ввода логина и пароля. Такая защита защитит вас от нагрузки на брутфорс атак.

Ограничиваем количество попыток авторизоваться в обход WordPress 58 комментариев
Полезные 5 Вопросы 1 Все
  • Михаил cайт: trapeznaya.ucoz.ru @

    Всё работает отлично! для справки - плагин debug log нашел 2 ошибки

    Undefined index: ххх.хх.хх.23
    Type: PHP Notice
    Line: 46
    File: /home/t/ххх/ххх/public_html/kama_limit_login/main.php
    Today
    19:36:15 GMT+0300
    Undefined index: action
    Type: PHP Notice
    Line: 28
    File: /home/t/ххх/ххх/public_html/kama_limit_login/main.php

    • Kama4662

      Поправил спасибо версия 3.1. Еще немного защиту улучшил...

      • Михаил cайт: trapeznaya.ucoz.ru @

        Спасибо! Вопросик хотел задать - зачем...
        $file_path = $cache_dir . "/{$domen}___{$action}___{$REQUEST_URI}.ini";
        почему не сделали просто
        $file_path = $cache_dir . "/$action.ini";

        • Kama4662

          Потому что скрипт можно заюзать сразу на несколько сайтов - вытащить в корень сервера и подключать потом от туда на всех сайтах на сервере - тогда чтобы была разница нужен домен... $REQUEST_URI нужно, чтобы ограничить кол. попыток для одной какой-то страницы, если например есть страница авторизации... Но думаю эту переменную можно убрать ...

        • Kama4662

          Хороший был вопрос - в итоге доработал код смотри версию 3.3. Убрал из названия файла REQUEST_URI. И обрати внимание что изменил название папки скрипта с kama_limit_login на _kama_wp_limit_login.

  • Сергей

    Добрый день, Кама!
    У меня к Вам два вопроса:

    1. Будет ли работать Ваш скрипт, если админка уже защищена с помощью файла .htpasswd?
    2. Какую защиту лучше оставить: Ваш скрипт или файл .htpasswd или обе эти защиты вместе? В данный момент у меня стоят обе защиты.
      Спасибо.
    Ответитьмесяц назад #
    • Михаил cайт: trapeznaya.ucoz.ru @

      Сходи в лес, помогает.

      1
      Ответитьмесяц назад #
      • Сергей

        Я смотрю ты шибко вумный. Тогда рассказываю для шибко вумных - если бы я знал ответ на вопрос, то и не задавал и не посещал подобные сайты. Тем более вопрос был задан не тебе, а автору статьи. А твой номер десятый, поэтому сиди и помалкивай, грамотей.

        1
        Ответитьмесяц назад #
    • Kama4662

      Если через .htpasswd к wp-login.php уже доступа нет, то этот мой скрипт уже не нужен!

      Он нужен как раз когда есть такое жесткое и неудобно ограничение, чтобы его заменить на более удобное. Ну, или когда у сайта есть пользователи, а защита от брута нужна, например как на этом сайте...

      Есть плагины для такой задачи, но они все работают через среду WordPress, а это лишняя нагрузка, которой абсолютно лишен текущий скрипт...

      Ответитьмесяц назад #

Здравствуйте, !

Ваш комментарий