Как отключить функцию «Блокировка попыток IP-адреса»?

9

Drupal блокирует IP-адрес, используемый для доступа к сайту, когда пользователь пытается войти в систему много раз.

Как я могу отключить эту функцию?

夏 期 劇場
источник

Ответы:

12

Что вы можете сделать, это добавить следующий код в файл settings.php.

$conf['user_failed_login_ip_limit'] = PHP_INT_MAX;

Таким образом, IP не будет заблокирован.

user_login_authenticate_validate () содержит следующий код.

  if (!empty($form_state['values']['name']) && !empty($password)) {
    // Do not allow any login from the current user's IP if the limit has been
    // reached. Default is 50 failed attempts allowed in one hour. This is
    // independent of the per-user limit to catch attempts from one IP to log
    // in to many different user accounts.  We have a reasonably high limit
    // since there may be only one apparent IP for all users at an institution.
    if (!flood_is_allowed('failed_login_attempt_ip', variable_get('user_failed_login_ip_limit', 50), variable_get('user_failed_login_ip_window', 3600))) {
      $form_state['flood_control_triggered'] = 'ip';
      return;
    }
    $account = db_query("SELECT * FROM {users} WHERE name = :name AND status = 1", array(':name' => $form_state['values']['name']))->fetchObject();
    if ($account) {
      if (variable_get('user_failed_login_identifier_uid_only', FALSE)) {
        // Register flood events based on the uid only, so they apply for any
        // IP address. This is the most secure option.
        $identifier = $account->uid;
      }
      else {
        // The default identifier is a combination of uid and IP address. This
        // is less secure but more resistant to denial-of-service attacks that
        // could lock out all users with public user names.
        $identifier = $account->uid . '-' . ip_address();
      }
      $form_state['flood_control_user_identifier'] = $identifier;

      // Don't allow login if the limit for this user has been reached.
      // Default is to allow 5 failed attempts every 6 hours.
      if (!flood_is_allowed('failed_login_attempt_user', variable_get('user_failed_login_user_limit', 5), variable_get('user_failed_login_user_window', 21600), $identifier)) {
        $form_state['flood_control_triggered'] = 'user';
        return;
      }
    }
    // We are not limited by flood control, so try to authenticate.
    // Set $form_state['uid'] as a flag for user_login_final_validate().
    $form_state['uid'] = user_authenticate($form_state['values']['name'], $password);
  }

Ограничений на самом деле два: один для случая, когда у Drupal всегда есть IP, и один для случая, когда у Drupal также есть идентификатор пользователя. Последнее относится к случаю, когда пользователь вводит имя пользователя для существующей учетной записи; в этом случае Drupal регистрирует ID пользователя и IP.
Если вы хотите избежать и этого случая, то вам нужно также добавить эту строку в файл setting.php.

$conf['user_failed_login_user_limit'] = PHP_INT_MAX;
$conf['user_failed_login_user_window'] = 5;
киамлалуно
источник
Привет Kiamlaluno, так что это значит, что мне нужно только добавить эти 2 строки в settings.php? Является ли PHP_INT_MAXбесконечный предел? Могу ли я также установить этот бесконечный предел (PHP_INT_MAX) user_failed_login_user_window? Потому что он установлен 5там.
劇場 期 劇場
PHP_INT_MAXмаксимальное значение, которое PHP может присвоить целому числу Я установил другое значение на 5, потому что это количество секунд, в течение которых действует ограничение. Если для user_failed_login_user_limit установлено значение 10, а для user_failed_login_user_window - 5, это означает, что 10 попыток входа в систему разрешены в течение 5 секунд. Просто измените файл settings.php, и IP-адреса / пользователи больше не будут заблокированы.
kiamlaluno
Извините за мою понятность, но я все еще не так очищен. Я искал и обнаружил, что [PHP_INT_MAX] составляет 2 миллиарда. Хорошо, значит ли это, что мы допустим до 2 миллиардов попыток за 5 секунд? Он уже готов как для IP, так и для имени пользователя?
劇場 期 劇場
Мое последнее беспокойство - ПОЛНОСТЬЮ ОТКЛЮЧИТЬ блокировку IP-адреса и / или пользователя USERNAME. [НЕТ ОГРАНИЧЕНИЙ больше, чтобы установить] Это только две строки уже решили?
劇場 期 劇場
Для 64-битной машины PHP_INT_MAXэто 9223372036854775807; для 32-битной машины его значение равно 2147483647. Вы правы; это количество попыток за 5 секунд. Если количество попыток меньше этого, IP / пользователь не блокируется.
kiamlaluno
0

В Drupal 8 вы можете изменить настройки потока в файле конфигурации user.flood.yml.

uid_only: false
ip_limit: 50
ip_window: 3600
user_limit: 5
user_window: 21600
_core:
  default_config_hash: UYfMzeP1S8jKaaaavxf7nQNe8DsNS-3bc2WSNNXBQWs

Это означает, что для каждого IP-адреса и каждого пользователя существует ограничение:

  • За 3600 секунд (1 час) допускается 50 попыток на IP-адрес
  • За 21600 секунд (6 часов) разрешено 5 попыток на учетную запись пользователя (довольно мало)

Вы можете изменить и импортировать настройки (я установил 100 попыток за 5 минут):

uid_only: false
ip_limit: 100
ip_window: 300
user_limit: 100
user_window: 300
_core:
  default_config_hash: UYfMzeP1S8jKaaaavxf7nQNe8DsNS-3bc2WSNNXBQWs
Флориан Мюллер
источник
Есть ли способ сделать это в settings.php или аналогичном, вместо изменения core / modules / user / config / install / user.flood.yml?
Дхрувеонмарс
@dhruveonmars вы можете переопределить все настройки в вашем settings.php. Это было бы что-то вроде$config['user.flood']['user_limit'] = 100;
Флориан Мюллер
Brilliant! Спасибо!!
Дхрувеонмарс