Interzicere logare dupa X incercari

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Stefan
Mesaje:117

Interzicere logare dupa X incercari

Salut, am gasit pe site acum cateva luni un script ( integrat intr-unul de login/register ) in care daca greseai parola de un numar de ori nu te mai puteai loga X minute.
Am facut ca, daca gresesti parola sa adauge in baza de date numele contului respectiv ( daca nu exista ), iar daca exista numarul de incercari a contului respectiv sa creasca. Dar nu am nicio idee cum sa fac ca la X incercari sa ii afiseze un mesaj cu "Nu te mai poti loga X minute si Y secunde" si sa ii blocheze accesul de a se loga.
Ma gandeam ca daca atinge numarul maxim de incercari sa se adauge in baza de date ora,minutul,secunda actuala iar peste X minute contul sa aiba din nou acces dar mai greu cu practica.

MarPlo Mesaje:4343
Salut
1) Se poate face asa ceva cu $_SESSION.
O sesiune cam asa:

Cod: Selectaţi tot

$_SESSION['nrlogs'] =[nr_logari, timp_unix] 
Si la fiecare logare se verifica si incrementeaza nr_logari daca timp_unix avea intervalul stabilit. Cand timp_unix trecea, nr_logari era setat 0 si timp_unix actualizat.

2) Sau cu baza de date, am facut un tabel, "user_temp" separat cu 4 coloane: nume, nri, ip, timp.

Cod: Selectaţi tot

$sql ="CREATE TABLE `user_temp` (`nume` VARCHAR(32) PRIMARY KEY, `nri` TINYINT UNSIGNED DEFAULT 0, `ip` VARCHAR(15), `dt` INT(10)) CHARACTER SET utf8 COLLATE utf8_general_ci"; 
1. La fiecare logare se sterg randurile cu timp expirat.

Cod: Selectaţi tot

// Sterge randurile din tabelul user_temp mai vechi de 10 min
$timp_expir = time()-600;
$sql ="DELETE FROM `user_temp` WHERE `dt`<$timp_expir"; 
2. Face Insert sau Update in "user_temp" pt utilizatorul care se logheaza:

Cod: Selectaţi tot

// adauga /incrementeaza nr. incercari cu 1 si actualizeaza data
$sql ="INSERT INTO `user_temp` (`nume`, `ip`, `dt`) VALUES ('$nume', '$ip', ". time() .") ON DUPLICATE KEY UPDATE `nri`=`nri`+1"; 
3. Se face Select la user-ul care se logheaza, daca e inregistrat in tabel cu nri depasit, aplica: exit('Mesaj transmis');:

Cod: Selectaţi tot

// face select pt. a verifica nr. incercari
$sql ="SELECT `nume`, `nri`, `dt` FROM `user_temp` WHERE `nume`='$nume' LIMIT 1";
//..efectueaza select-ul, cum stii, apoi se verifica valoarea de la nri
if($row['nri'] >3) exit('Depasire incercari d3 logare'); 
- Incearca si vezi ce iese.

Stefan Mesaje:117

Cod: Selectaţi tot

<?php
if (empty($_POST) === false) {
    $username = $_POST['username'];
    $parola   = $_POST['parola'];
    $ip       = $_SERVER['REMOTE_ADDR']; // preia ip-ul

        $login = login($username,$parola);
        if ($login === false) {
            $erori[] = 'Combinatia username/parola nu este corecta';
            [b]$data = time();
            $data_expir = $data-601;
            $ip = $_SERVER['REMOTE_ADDR'];            
            mysql_query("INSERT INTO `user_temp` (username, ip, data) VALUES ('". $_POST['username'] ."', '$ip', '$data') ON DUPLICATE KEY UPDATE `incercari`=`incercari`+1");[/b]
        } else {
             // verificam daca user-ul s-a logat cu succes
        }
        if (user_existent_res($username) === true){
            $sql = mysql_query("SELECT `username`, `incercari`, `data` FROM `user_temp` WHERE `username`='". $_POST['username'] ."' LIMIT 1");
            $row = mysql_fetch_assoc($sql);
        //..efectueaza select-ul, cum stii, apoi se verifica valoarea de la nri
        if($row['incercari'] >3) { 
        $timp_expir = time()-10;
        $sql ="DELETE FROM `user_temp` WHERE `data`<$timp_expir"; 
            exit('Depasire incercari d3 logare');
            }
        }
    } 
} else {
        $erori[] = 'Nu au fost primite date';
}
?>
Daca introduc date gresite afiseaza mesajul fiinca a incercat mai mult de 3 ori, dar user-ul nu se sterge dupa 10 secunde (am scazut timpul la 10 secunde ) + daca introduc datele corecte ma pot loga, ce e gresit ?

MarPlo Mesaje:4343
Instructiunea $sql cu DELETE randuri din tabel se executa Inainte de cea cu INSERT. Vezi ordinea data in raspunsul precedent.

Stefan Mesaje:117
L-am pus inainte de INSERT si tot nu se sterge, de ce :-?? . Dar macar s-a rezolvat problema " daca introduc datele corecte ma pot loga"

MarPlo Mesaje:4343
Acel $sql cu DELETE ar trebui executat /transmis la mysql nu doar adaugata instructiunea in variabila $sql.

Stefan Mesaje:117
Mersi, dar pentru a afisa cat timp mai are cum fac ? (descrescator) De ex. intervalul dupa care se va sterge user-ul din baza de date este de 10 min, si sa numere descrescator

Am incercat cu

Cod: Selectaţi tot

$timp = floor($timp_expir/60). ' minute, '. ($timp_expir%60). ' secunde';
$erori[] = 'Depasire incercari d3 logare '. $timp_expir .' si '. $timp .'';
 
Dar imi afiseaza
"Depasire incercari d3 logare 1460179830 si 24336330 minute, 30 secunde"

$timp_expir = 1460179830
$data = 1460180083

P.s
De ce se sterge doar numarul de incercari si nu tot randul ?

MarPlo Mesaje:4343
Ca sa afisezi cat timp mai are, se scade timpul din baza de date din timpul curent.
Cam asa, dupa ce se face select pt. a verifica nr. incercari:

Cod: Selectaţi tot

$timp_ramas = time() - $row['dt']; 
- Se sterg toate randurile cu timp expirat, dar Insert-ul adauga iar rand cu numar incercari si timp resetate pt. logarea curenta.