Bugfix sul controllo brute-force

This commit is contained in:
Thomas Zilio 2017-09-04 10:43:22 +02:00
parent c7e88bcf5e
commit 10da3933ca
2 changed files with 20 additions and 7 deletions

View File

@ -38,6 +38,8 @@ class Auth extends \Util\Singleton
'attemps' => 3, 'attemps' => 3,
'timeout' => 180, 'timeout' => 180,
]; ];
/** @var bool Informazioni riguardanti la condizione brute-force */
protected static $is_brute;
/** @var array Informazioni riguardanti l'utente autenticato */ /** @var array Informazioni riguardanti l'utente autenticato */
protected $infos; protected $infos;
@ -161,7 +163,7 @@ class Auth extends \Util\Singleton
// Controllo in automatico per futuri cambiamenti dell'algoritmo di password // Controllo in automatico per futuri cambiamenti dell'algoritmo di password
if ($rehash) { if ($rehash) {
$database = Database::getConnection(); $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; return $result;
@ -195,7 +197,7 @@ class Auth extends \Util\Singleton
$database = Database::getConnection(); $database = Database::getConnection();
try { 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)) { if (!empty($results)) {
$results[0]['is_admin'] = ($results[0]['gruppo'] == 'Amministratori'); $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 * @return bool
*/ */
@ -369,18 +371,29 @@ class Auth extends \Util\Singleton
{ {
$database = Database::getConnection(); $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 * @return int
*/ */
public static function getBruteTimeout() public static function getBruteTimeout()
{ {
if (self::isBrute()) {
return 0;
}
$database = Database::getConnection(); $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'); $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');

View File

@ -133,7 +133,7 @@ function get_permessi($nome_modulo)
trigger_error(_('Funzione deprecata!'), E_USER_DEPRECATED); trigger_error(_('Funzione deprecata!'), E_USER_DEPRECATED);
$dbo = \Database::getConnection(); $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); $rs = $dbo->fetchArray($query);
if (count($rs) <= 0) { if (count($rs) <= 0) {
// Ultimo tentativo: se non ci sono i permessi ma sono l'amministratore posso comunque leggere il modulo // Ultimo tentativo: se non ci sono i permessi ma sono l'amministratore posso comunque leggere il modulo