Jak wyłączyć funkcję „Blokowanie adresów IP przez powódź”?

9

Drupal blokuje adres IP używany do uzyskania dostępu do strony, gdy użytkownik próbuje zalogować się wiele razy.

Jak mogę wyłączyć tę funkcję?

夏 期 劇場
źródło

Odpowiedzi:

12

Co możesz zrobić, to dodać następujący kod w pliku settings.php.

$conf['user_failed_login_ip_limit'] = PHP_INT_MAX;

W ten sposób adres IP nie zostanie zablokowany.

user_login_authenticate_validate () zawiera następujący kod.

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

Granice są w rzeczywistości dwa: jeden w przypadku, gdy Drupal ma zawsze adres IP, a drugi, gdy Drupal ma również identyfikator użytkownika. To drugie dotyczy przypadku, gdy użytkownik wprowadzi nazwę użytkownika dla istniejącego konta; w takim przypadku Drupal rejestruje identyfikator użytkownika i adres IP.
Jeśli chcesz również uniknąć tego przypadku, musisz również dodać tę linię do pliku setting.php.

$conf['user_failed_login_user_limit'] = PHP_INT_MAX;
$conf['user_failed_login_user_window'] = 5;
kiamlaluno
źródło
Cześć Kiamlaluno, więc to znaczy, że JEDYNIE POTRZEBUJĘ dodać te 2 linie w settings.php? Czy PHP_INT_MAXnieskończony limit? Czy mogę również ustawić ten nieskończony limit (PHP_INT_MAX) user_failed_login_user_windowrównież na? Ponieważ jest ustawiony jak 5tam.
夏 期 劇場
PHP_INT_MAXto maksymalna wartość, jaką PHP może przypisać do liczby całkowitej. Ustawiłem drugą wartość na 5, ponieważ jest to liczba sekund, przez którą obowiązuje limit. Jeśli ustawisz user_failed_login_user_limit na 10, a user_failed_login_user_window na 5, oznacza to, że 10 prób logowania jest dozwolonych w 5 sekund. Wystarczy zmienić plik settings.php, a adresy IP / użytkownicy nie będą już blokowani.
kiamlaluno
Przepraszam za moją zrozumiałość, ale wciąż nie jestem tak oczyszczony. Szukałem i stwierdziłem, że [PHP_INT_MAX] to 2 miliardy. Ok, to znaczy, że pozwolimy teraz na 2 miliardy prób między 5 sekundami teraz? Czy jest już gotowy na IP i nazwę użytkownika?
夏 期 劇場
Moim ostatnim celem jest CAŁKOWICIE WYŁĄCZENIE próby zablokowania adresu IP i / lub USERNAME. [BRAK OGRANICZEŃ już ustawionych] Czy te tylko 2 linie już to rozwiązują?
夏 期 劇場
W przypadku komputera 64-bitowego PHP_INT_MAXjest to 9223372036854775807; dla maszyny 32-bitowej jej wartość to 2147483647. Masz rację; to liczba prób w ciągu 5 sekund. Jeśli liczba prób jest niższa, adres IP / użytkownik nie jest blokowany.
kiamlaluno
4

Moduł Flood Control poradzi sobie z tym elegancko.

bkudrle
źródło
0

W Drupal 8 możesz zmienić ustawienia powodzi w pliku konfiguracyjnym user.flood.yml.

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

Oznacza to, że na adres IP i na użytkownika istnieje limit:

  • Na 3600 sekund (1 godzinę) dozwolonych jest 50 prób na adres IP
  • Na 21600 sekund (6 godzin) dozwolonych jest 5 prób na konto użytkownika (całkiem niewiele)

Możesz zmienić i zaimportować ustawienia (ustawiłem na 100 prób na 5 minut):

uid_only: false
ip_limit: 100
ip_window: 300
user_limit: 100
user_window: 300
_core:
  default_config_hash: UYfMzeP1S8jKaaaavxf7nQNe8DsNS-3bc2WSNNXBQWs
Florian Müller
źródło
Czy jest jakiś sposób, aby to zrobić w pliku settings.php lub podobnym, zamiast modyfikować plik core / modules / user / config / install / user.flood.yml?
dhruveonmars
@dhruveonmars możesz zastąpić każde ustawienie w pliku settings.php. To byłoby coś w stylu$config['user.flood']['user_limit'] = 100;
Florian Müller
Znakomity! Dzięki wielkie!!
dhruveonmars