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
-
- Mesaje:117
Interzicere logare dupa X incercari
MarPlo
Mesaje:4343
Salut
1) Se poate face asa ceva cu $_SESSION.
O sesiune cam asa:
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.
1. La fiecare logare se sterg randurile cu timp expirat.
2. Face Insert sau Update in "user_temp" pt utilizatorul care se logheaza:
3. Se face Select la user-ul care se logheaza, daca e inregistrat in tabel cu nri depasit, aplica: exit('Mesaj transmis');:
- Incearca si vezi ce iese.
1) Se poate face asa ceva cu $_SESSION.
O sesiune cam asa:
Cod: Selectaţi tot
$_SESSION['nrlogs'] =[nr_logari, timp_unix]
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";
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";
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";
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');
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';
}
?>
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
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 ?
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 .'';
"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:
- Se sterg toate randurile cu timp expirat, dar Insert-ul adauga iar rand cu numar incercari si timp resetate pt. logarea curenta.
Cam asa, dupa ce se face select pt. a verifica nr. incercari:
Cod: Selectaţi tot
$timp_ramas = time() - $row['dt'];