Pagina 1 din 1

Interzicere logare dupa X incercari

Scris: Joi Apr 07, 2016
de Stefan
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.

Interzicere logare dupa X incercari

Scris: Joi Apr 07, 2016
de MarPlo
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.

Interzicere logare dupa X incercari

Scris: Vin Apr 08, 2016
de Stefan

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 ?

Interzicere logare dupa X incercari

Scris: Vin Apr 08, 2016
de MarPlo
Instructiunea $sql cu DELETE randuri din tabel se executa Inainte de cea cu INSERT. Vezi ordinea data in raspunsul precedent.

Interzicere logare dupa X incercari

Scris: Vin Apr 08, 2016
de Stefan
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"

Interzicere logare dupa X incercari

Scris: Vin Apr 08, 2016
de MarPlo
Acel $sql cu DELETE ar trebui executat /transmis la mysql nu doar adaugata instructiunea in variabila $sql.

Interzicere logare dupa X incercari

Scris: Sâm Apr 09, 2016
de Stefan
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 ?

Interzicere logare dupa X incercari

Scris: Sâm Apr 09, 2016
de MarPlo
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.