Como desabilito a funcionalidade "Tentativas de inundação de bloqueio de IP"?

9

O Drupal bloqueia o IP usado para acessar o site, quando um usuário tenta efetuar login várias vezes.

Como posso desativar esta funcionalidade?

夏 期 劇場
fonte

Respostas:

12

O que você pode fazer é adicionar o seguinte código no arquivo settings.php.

$conf['user_failed_login_ip_limit'] = PHP_INT_MAX;

Dessa maneira, o IP não será bloqueado.

user_login_authenticate_validate () contém o seguinte código.

  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);
  }

Na verdade, os limites são dois: um para o caso Drupal sempre tem um IP e outro para quando o Drupal também possui um ID do usuário. O último é o caso em que o usuário insere um nome de usuário para uma conta existente; nesse caso, o Drupal registra o ID do usuário e o IP.
Se você quiser evitar também esse caso, precisará adicionar também esta linha ao arquivo setting.php.

$conf['user_failed_login_user_limit'] = PHP_INT_MAX;
$conf['user_failed_login_user_window'] = 5;
kiamlaluno
fonte
Oi Kiamlaluno, isso significa que eu só preciso adicionar essas 2 linhas no settings.php? O PHP_INT_MAXlimite é infinito? Também posso definir esse limite infinito (PHP_INT_MAX) para user_failed_login_user_windowtambém? Porque está definido como 5lá.
夏期劇場
PHP_INT_MAXé o valor máximo que o PHP pode atribuir a um número inteiro. Defino o outro valor como 5 porque esse é o número de segundos para os quais o limite é válido. Se você definir user_failed_login_user_limit como 10 e user_failed_login_user_window como 5, isso significa que 10 tentativas de login são permitidas em 5 segundos. Apenas altere o arquivo settings.php e os IPs / usuários não serão mais bloqueados.
kiamlaluno
Desculpe pela minha compreensão, mas ainda não estou tão esclarecido ainda. Pesquisei e descobri que [PHP_INT_MAX] é de 2 bilhões. Ok, significa que vamos permitir até 2 bilhões de tentativas entre 5 segundos agora? Já está pronto para IP e nome de usuário também?
夏期劇場
Minha preocupação final é desativar totalmente o IP e / ou USERNAME na tentativa de bloqueio. [Não há mais limites para definir] Essas duas linhas já estão resolvidas?
夏期劇場
Para uma máquina de 64 bits, PHP_INT_MAXé 9223372036854775807; para uma máquina de 32 bits, seu valor é 2147483647. Você está correto; esse é o número de tentativas em 5 segundos. Se o número de tentativas for menor que isso, o IP / usuário não será bloqueado.
kiamlaluno
0

No Drupal 8 , você pode alterar as configurações de inundação no arquivo de configuração user.flood.yml.

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

Isso significa que, por IP e por usuário, há um limite:

  • Por 3600 segundos (1 hora), são permitidas 50 tentativas por endereço IP
  • Por 21600 segundos (6 horas), são permitidas 5 tentativas por conta de usuário (poucas)

Você pode alterar e importar as configurações (eu a defino para 100 tentativas a cada 5 minutos):

uid_only: false
ip_limit: 100
ip_window: 300
user_limit: 100
user_window: 300
_core:
  default_config_hash: UYfMzeP1S8jKaaaavxf7nQNe8DsNS-3bc2WSNNXBQWs
Florian Müller
fonte
Existe alguma maneira de fazer isso em settings.php, ou similar, em vez de modificar core / modules / user / config / install / user.flood.yml?
dhruveonmars 27/02
@dhruveonmars, você pode substituir todas as configurações do seu settings.php. Seria algo como$config['user.flood']['user_limit'] = 100;
Florian Müller
Brilhante! Muito obrigado!!
dhruveonmars