diff --git a/lib/classes/Auth.php b/lib/classes/Auth.php index 9cdf65f22..85c235ff6 100644 --- a/lib/classes/Auth.php +++ b/lib/classes/Auth.php @@ -38,6 +38,8 @@ class Auth extends \Util\Singleton 'attemps' => 3, 'timeout' => 180, ]; + /** @var bool Informazioni riguardanti la condizione brute-force */ + protected static $is_brute; /** @var array Informazioni riguardanti l'utente autenticato */ protected $infos; @@ -161,7 +163,7 @@ class Auth extends \Util\Singleton // Controllo in automatico per futuri cambiamenti dell'algoritmo di password if ($rehash) { $database = Database::getConnection(); - $database->update('zz_users', ['password' => self::hashPassword($password)], ['id_utente' => $user_id]); + $database->update('zz_users', ['password' => self::hashPassword($password)], ['id' => $user_id]); } return $result; @@ -195,7 +197,7 @@ class Auth extends \Util\Singleton $database = Database::getConnection(); try { - $results = $database->fetchArray('SELECT id AS id_utente, idanagrafica, username, (SELECT nome FROM zz_groups WHERE id=idgruppo) AS gruppo FROM zz_users WHERE id = '.prepare($user_id).' AND enabled = 1 LIMIT 1', false, ['session' => false]); + $results = $database->fetchArray('SELECT id AS id_utente, idanagrafica, username, (SELECT nome FROM zz_groups WHERE zz_groups.id=zz_users.idgruppo) AS gruppo FROM zz_users WHERE id = '.prepare($user_id).' AND enabled = 1 LIMIT 1', false, ['session' => false]); if (!empty($results)) { $results[0]['is_admin'] = ($results[0]['gruppo'] == 'Amministratori'); @@ -361,7 +363,7 @@ class Auth extends \Util\Singleton } /** - * Controlla se sono in corso molti tentativi di accesso (possibile brute-forcing). + * Controlla se sono in corso molti tentativi di accesso (possibile brute-forcing in corso). * * @return bool */ @@ -369,18 +371,29 @@ class Auth extends \Util\Singleton { $database = Database::getConnection(); - $results = $database->fetchArray('SELECT COUNT(*) AS tot FROM zz_logs WHERE ip = '.prepare(get_client_ip()).' AND stato = '.prepare(self::getStatus()['failed']['code']).' AND DATE_ADD(created_at, INTERVAL '.self::$brute['timeout'].' SECOND) >= NOW()'); + if ($database->isInstalled()) { + return false; + } - return $results[0]['tot'] > self::$brute['attemps']; + if (!isset(self::$is_brute)) { + $results = $database->fetchArray('SELECT COUNT(*) AS tot FROM zz_logs WHERE ip = '.prepare(get_client_ip()).' AND stato = '.prepare(self::getStatus()['failed']['code']).' AND DATE_ADD(created_at, INTERVAL '.self::$brute['timeout'].' SECOND) >= NOW()'); + self::$is_brute = $results[0]['tot'] > self::$brute['attemps']; + } + + return self::$is_brute; } /** - * Restituisce il tempo di attesa rimanente per lo sblocco automatico dellla protezione contro attacchi brute-forc. + * Restituisce il tempo di attesa rimanente per lo sblocco automatico dellla protezione contro attacchi brute-force. * * @return int */ public static function getBruteTimeout() { + if (self::isBrute()) { + return 0; + } + $database = Database::getConnection(); $results = $database->fetchArray('SELECT TIME_TO_SEC(TIMEDIFF(DATE_ADD(created_at, INTERVAL '.self::$brute['timeout'].' SECOND), NOW())) AS diff FROM zz_logs WHERE ip = '.prepare(get_client_ip()).' AND stato = '.prepare(self::getStatus()['failed']['code']).' AND DATE_ADD(created_at, INTERVAL '.self::$brute['timeout'].' SECOND) >= NOW() ORDER BY created_at DESC LIMIT 1'); diff --git a/lib/deprecated.php b/lib/deprecated.php index bba3793c0..e746a1308 100644 --- a/lib/deprecated.php +++ b/lib/deprecated.php @@ -133,7 +133,7 @@ function get_permessi($nome_modulo) trigger_error(_('Funzione deprecata!'), E_USER_DEPRECATED); $dbo = \Database::getConnection(); - $query = 'SELECT *, (SELECT idanagrafica FROM zz_users WHERE id_utente='.prepare($_SESSION['id_utente']).') AS idanagrafica FROM zz_permissions WHERE idgruppo=(SELECT idgruppo FROM zz_users WHERE id_utente='.prepare($_SESSION['id_utente']).') AND idmodule=(SELECT id FROM zz_modules WHERE name='.prepare($nome_modulo).')'; + $query = 'SELECT *, (SELECT idanagrafica FROM zz_users WHERE id='.prepare($_SESSION['id_utente']).') AS idanagrafica FROM zz_permissions WHERE idgruppo=(SELECT idgruppo FROM zz_users WHERE id='.prepare($_SESSION['id_utente']).') AND idmodule=(SELECT id FROM zz_modules WHERE name='.prepare($nome_modulo).')'; $rs = $dbo->fetchArray($query); if (count($rs) <= 0) { // Ultimo tentativo: se non ci sono i permessi ma sono l'amministratore posso comunque leggere il modulo