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,
'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');

View File

@ -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