Comment désactiver la fonctionnalité "Blocage des tentatives d'inondation IP"?

9

Drupal bloque l'adresse IP utilisée pour accéder au site, lorsqu'un utilisateur essaie de se connecter plusieurs fois.

Comment puis-je désactiver cette fonctionnalité?

夏 期 劇場
la source

Réponses:

12

Ce que vous pouvez faire, c'est ajouter le code suivant dans le fichier settings.php.

$conf['user_failed_login_ip_limit'] = PHP_INT_MAX;

De cette façon, l'IP ne sera pas bloquée.

user_login_authenticate_validate () contient le code suivant.

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

Les limites sont en fait deux: une pour le cas où Drupal a toujours une IP, et une pour quand Drupal a aussi un ID utilisateur. Ce dernier est dans le cas où l'utilisateur entre un nom d'utilisateur pour un compte existant; dans ce cas, Drupal enregistre l'ID utilisateur et l'IP.
Si vous souhaitez également éviter ce cas, vous devez également ajouter cette ligne au fichier setting.php.

$conf['user_failed_login_user_limit'] = PHP_INT_MAX;
$conf['user_failed_login_user_window'] = 5;
kiamlaluno
la source
Salut Kiamlaluno, donc cela signifie que je n'ai besoin que d'ajouter ces 2 lignes dans le settings.php? La PHP_INT_MAXlimite est -elle infinie? Puis-je également définir cette limite infinie (PHP_INT_MAX) user_failed_login_user_windowégalement? Parce qu'il est défini comme 5là-bas.
夏 期 劇場
PHP_INT_MAXest la valeur maximale que PHP peut affecter à un entier. J'ai défini l'autre valeur sur 5 car c'est le nombre de secondes pour lesquelles la limite est valide. Si vous définissez user_failed_login_user_limit sur 10 et user_failed_login_user_window sur 5, cela signifie que 10 tentatives de connexion sont autorisées en 5 secondes. Modifiez simplement le fichier settings.php, et les IP / utilisateurs ne seront plus bloqués.
kiamlaluno
Désolé pour ma compréhensibilité, mais je ne suis toujours pas aussi clair. J'ai recherché et trouvé que [PHP_INT_MAX] est de 2 milliards. Ok alors, cela signifie-t-il que nous autoriserons jusqu'à 2 milliards de tentatives entre 5 secondes maintenant? Est-il déjà prêt pour IP et nom d'utilisateur?
夏 期 劇場
Ma dernière préoccupation est de DÉSACTIVER TOTALEMENT l'IP et / ou le NOM D'UTILISATEUR tentant de bloquer. [AUCUNE LIMITATION à définir] Ces 2 lignes seulement le résolvent-elles déjà?
夏 期 劇場
Pour une machine 64 bits, PHP_INT_MAXest 9223372036854775807; pour une machine 32 bits, sa valeur est 2147483647. Vous avez raison; c'est le nombre de tentatives en 5 secondes. Si le nombre de tentatives est inférieur à cela, l'IP / utilisateur n'est pas bloqué.
kiamlaluno
0

Dans Drupal 8 , vous pouvez modifier les paramètres d'inondation dans le fichier de configuration user.flood.yml.

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

Cela signifie que par IP et par utilisateur, il y a une limite:

  • Par 3600 secondes (1 heure), 50 tentatives par adresse IP sont autorisées
  • Par 21600 secondes (6 heures), 5 tentatives par compte d'utilisateur sont autorisées (assez peu)

Vous pouvez modifier et importer les paramètres (je l'ai défini sur 100 tentatives toutes les 5 minutes):

uid_only: false
ip_limit: 100
ip_window: 300
user_limit: 100
user_window: 300
_core:
  default_config_hash: UYfMzeP1S8jKaaaavxf7nQNe8DsNS-3bc2WSNNXBQWs
Florian Müller
la source
Existe-t-il un moyen de le faire dans settings.php, ou similaire, au lieu de modifier core / modules / user / config / install / user.flood.yml?
dhruveonmars
@dhruveonmars, vous pouvez remplacer tous les paramètres de votre settings.php. Ce serait quelque chose comme$config['user.flood']['user_limit'] = 100;
Florian Müller
Brillant! Merci beaucoup!!
dhruveonmars