WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Ограничиваем количество попыток авторизоваться в обход 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 прерывается не доходя до WordPress и выводится сообщение.

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

Кama Wp Limit Login ver 3.5
Скачано: 204, размер: 2.3 KB
  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. И вы уведите дополнительное окно для ввода логина и пароля. Такая защита защитит вас от нагрузки на брутфорс атак.

56 комментов
Полезные 6 Все
  • @ Андрей

    Добрый день!

    Все сделал, как описано. Скачал папку, положил в корень сайта, права на папку уже стояли "755", добавил строчку в файл wp-config.php

    При попытке неправильно авторизироваться ничего не происходит. В чем может быть дело?

    Ответить5.3 лет назад #
    • Kama7482

      Файл не подключается видимо, попробуйте так написать:

      require_once($_SERVER['DOCUMENT_ROOT'] . '/kama_limit_login/main.php');
      Ответить5.3 лет назад #
  • @ Андрей

    Не получается. Ничего не происходит. Но если прописываю полный путь, например:

    require_once($_SERVER['DOCUMENT_ROOT'] . '/var/www/пользователь/data/www/домен.ру/kama_limit_login/main.php');

    то сайт перестает работать, просто белая страница.

    Ответить5.3 лет назад #
    • Kama7482

      Не знаю, нужно смотреть, так не знаю что может быть.

      Ответить5.3 лет назад #
  • Евгений

    Спасибо! Ваш плагинчик хорошо отработал!

    Ответить5.3 лет назад #
  • Shtirlitz cайт: blogbankir.ru

    А где плагин? дайте ссылку на скачивание!

    Ответить5.3 лет назад #
    • Kama7482

      Глюк какой-то был, поправил thank_you

      Ответить5.3 лет назад #
      • Shtirlitz cайт: blogbankir.ru

        спс.
        Тока не увидел, что же там появляется, мои другие плагины раньше меня заблокали:
        ERROR: Login failed because your IP address has been blocked. Please contact the administrator.
        так что расскажите smile

        Ответить5.3 лет назад #
  • Федор

    спасибо. простой и легкий способ и отлично работает.

    Ответить5.1 лет назад #
  • Ikota cайт: hm-nsk.ru

    Мне не нравится, что в папку можно войти из адресной строки.
    Но я подправил, закинул index.php

    Ответить5 лет назад #
  • Rencontrez cайт: www.krasbaks.ru

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

    Ответить4.8 года назад #
    • Kama7482

      Ага, у меня тоже он установлен - работает. Надо только создаваемые файлы в подпапку сунуть, неудобно а то. crazy

      Ответить4.8 года назад #
  • Юрий

    Спасибо, забрал smile

    Ответить4.3 года назад #
  • Я сначала подключил reCaptcha 2,0 via Google, собираюсь проверять её постоянно при входе, регистрации или восстановлении пароля. Но тут я наткнулся на эту страницу. Теперь не знаю, что лучше использовать. С одной стороны капча очень легкая, вводить ничего не нужно, все делается одним кликом. С другой стороны - ограничивать количество ввода паролей более надежно. Что посоветуете? smile gamer

    1
    Ответить3 года назад #
    • Kama7482

      Этот вариант я, кроме ограничения, использую еще и для снижения нагрузки на сервер при брут атаках. Так что рекомендую этот вариант. С таким подходом капча не нужна...

      1
      Ответить3 года назад #
      • Спасибо за ответ )
        Просмотрел код - и он мне понравился, так что использовать его буду точно, но, наверное, сначала буду проверять капчу, и если количество попыток превысит 7-10 - тогда уже можно выписывать бан)

        1
        Ответить3 года назад #
        • Не дается запустить такую защиту на локальном сервере(Open Server). Аутентификацию провожу аяксом при помощи функции wp_signon. Кеш в папку не пишется, хотя файл main.php подключил вроде как правильно. Сюда вписал свои переменные

          if ( !in_array( $action, array( 'postpass', 'logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login', 'log', 'pwd', 'user_login', 'user_email', 'pass1', 'pass2', ), true ) )

          Пробую ввести неверно пароль 3 раза - ничего не происходит. На локальном сервере работать не будет, нужно будет настраивать уже после того, как на VPS залью? Спасибо!
          З.Ы. От капчи решил отказаться, геморроя с ней много, а профит весьма сомнителен.

          Ответить3 года назад #
          • Kama7482

            Очень странно, сделал сейчас все как написано, тоже на Open Server - все работает! Вы что-то не так делаете, скорее всего просто файл main.php не полключается...

            Зачем вы вписали переменные? Они нужны чтобы для разных действий был разный файл - т.е. 3 попытки на одно действие... Там значение параметра action - пр: /wp-login.php?action=lostpassword кажется вы зря туда понаписали переменных, но как бы то ни было - это не должно влиять на работу...

            1
            Ответить3 года назад #
            • Файл подключился, поскольку если делаешь в нем ошибку - сайт не работает, говорит об ошибке в этом файле.

              Мне кажется проблема в другом, поскольку я использую кастомный способ входа на сайт: аяксом отправляются данные, на сервере есть файл-сортировщик, в котором подключены файлы типа login.php, register.php, logout.php, edit_profile.php и т.д. Они обрабатывают запросы и присылают ответ тоже аяксом. Login.php проверяет поля, формирует запрос и уже потом пытается сделать wp_signon с полученными данными.

              Я просто не знаю, как сделана стандартная форма входа, работает ли она по тому же принципу, что и моя? Как я понимаю, wp_signon тоже обращается к wp-login.php? Мне кажется, что причина где-то тут, попробую еще покопаться.

              Ответить3 года назад #
              • Kama7482

                wp_signon() - это, если можно так сказать, самодостаточная функция, которая ставит куки авторизации и запускает фильтры.

                В вашем случае, мой код видимо не срабатывает. wp_signon никуда не обращается, там наоборот wp-login.php работает на основе wp_signon()...

                Вам нужно убедиться что мой код срабатывает для вашего случая авторизации. То что он подключается это очевидно, потому что без wp-config.php WP работать не будет...

                1
                Ответить3 года назад #
            • У меня просто нет такого запроса /wp-login.php?action=lostpassword, у меня все делает динамически, без перезагрузки....

              Ответить3 года назад #
              • Kama7482

                Вот в этом и проблема скорее всего. Мой код ждет что будет GET параметр запроса action с допустимым значением. Нужно изменить это условие в моем коде и у вас все должно заработать.

                1
                Ответить3 года назад #
                • Да, я так и понял mosking Посижу пару дней, может что-то толковое в голову придет, как это можно все реализовать. Если придумаю - обязательно поделюсь, может еще кому-то пригодится. Если у вас есть какие-либо мысли - тоже с радостью выслушаю )

                  Ответить3 года назад #
  • Сергей

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

    1. Будет ли работать Ваш скрипт, если админка уже защищена с помощью файла .htpasswd?
    2. Какую защиту лучше оставить: Ваш скрипт или файл .htpasswd или обе эти защиты вместе? В данный момент у меня стоят обе защиты.
      Спасибо.
    Ответить1.6 года назад #
    • Kama7482

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

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

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

      Ответить1.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться