Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: Max 3 tentativi login

  1. #1

    Max 3 tentativi login

    ciao, sono 2 gg che cerco di inserire un controllo nel login, ovvero ho impostato tutto ciò che riguarda registrazione, recupero password, autenticazione.
    Come posso inserire il reset della password dopo 3 tentativi di login falliti?
    Di seguito il mio codice, la user.class e il login.php


    ----parte dello user.class
    <?php
    function session_handler()
    {
    $ret = 0;
    if (isset($_SESSION["user_acc"])) {
    $this->username=$_SESSION["user_acc"];
    $ret = 1;
    }
    if (isset($_SESSION["pass_acc"])) {
    $this->password=$_SESSION["pass_acc"];
    $ret = 1;
    }
    if (isset($_SESSION["id_acc"])) {
    $this->id=$_SESSION["id_acc"];
    $ret = 1;
    }
    if (isset($_SESSION["profilo"])) {
    $this->profilo=$_SESSION["profilo"];
    $ret = 1;
    }
    return($ret);
    }

    function post_handler()
    {
    $ret = 0;
    if (isset($_POST["user_acc"])) {
    $this->username=$_POST["user_acc"];
    $ret = 1;
    }
    if (isset($_POST["pass_acc"])) {
    $this->password=$_POST["pass_acc"];
    $ret = 1;
    }
    return($ret);
    }


    function auth()
    {
    global $db;

    $this->session_handler();
    $this->post_handler();

    $ida = 0;

    $sql = "Select ".$this->pk." From ".$this->tabella." ";
    $sql .= "Where username='".$this->username."' And password='".$this->password."'";
    $db->query($sql);
    $db->next_record();
    $ida = $db->f($this->pk);

    if ($ida > 0)
    {
    $this->id = $ida;

    $_SESSION["user_acc"] = $this->username;
    $_SESSION["pass_acc"] = $this->password;
    $_SESSION["id_acc"] = $this->id;
    $_SESSION["profilo"] = $this->profilo;

    $this->User($this->id);
    }
    else
    {
    $this->id = 0;
    $this->logout();
    }
    }

    function creaPwd()
    {
    $lenght = 8;
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ*+% $&#";
    $maxlength = strlen($possible);
    if ($length > $maxlength) {
    $length = $maxlength;
    }
    for ($i = 0; $i<$lenght; $i++)
    {
    //prende un carattere random tra quelli possibili
    $char = substr($possible, mt_rand(0, $maxlength-1), 1);
    //è stato già usato?
    if (!strstr($password, $char)) { //no
    $password .= $char;
    }
    }
    $this->password = $password;
    }

    //username = codice fiscale
    //password = random
    function creaAccount()
    {
    global $db;

    $this->creaPwd();

    $sql = "UPDATE user ";
    $sql .="SET username='".$this->codice_fiscale."', password='".$this->password."'";
    $sql .= " WHERE id = '".$this->id."'";
    $db->query($sql);

    //invia mail con account
    mail($this->email, "Nuovo utente", "Username:".$this->username."\nPassword:".$this->password);
    mail(EMAIL, "Nuovo utente", "Creato nuovo agente: Username:".$this->username."\n");
    }

    function sendPwd($username, $email)
    {
    global $db;

    $this->creaPwd();

    $sql = "SELECT id, email, username FROM user ";
    $sql .= " WHERE username = '".$username."' AND email='".$email."'";
    $db->query($sql);
    $db->next_record();

    if ($db->f(0)!="")
    {
    $sql = "UPDATE user ";
    $sql .="SET password='".$this->password."'";
    $sql .= " WHERE id = '".$db->f(0)."'";
    $db->query($sql);

    //invia mail con account
    mail($db->f(1), "Recupera password", "Username:".$db->f(2)."\nPassword:".$db->f(2));
    mail(EMAIL, "Recupera password", "Recupera password per l'agente: Username:".$db->f(2)."\n");

    return "OK";
    }
    else {
    //utente non esiste
    return "KO";
    }

    }
    ?>
    ----

    ----parte del login.php
    <?php
    include("includes/config.php");

    $user = new User();
    $user->auth();

    if (isset($_SESSION["id_acc"]))
    {
    header('location:index.php');
    }

    if (isset($_POST['action']))
    {
    $notifica = "ATTENZIONE: Username e/o password errate";

    }
    ?>

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Scritto tutto così senza indentazione mi fa passare la voglia di leggere il codice, quindi senza leggerlo ti dico come farei io.

    Tabella "tentativi" nel db, campi: username e num_tentativo

    Si tenta il primo login, se va bene si entra e non succede niente.
    Se va male
    - si inserisce l'username nella tabella "tentativi" e si mette num_tentativi = 1
    - si riprova il login
    -- se va bene si elimina la entry relativa all'username dalla tabella "tentativi" e si entra
    -- se va male si fa +1 a num_tentativi relativo all'username usato e si ripropone il login

    se num_tentativi arriva a 3, si legge dal db l'email relativa all'username e si invia una mail di notifica, inoltre nella tabella degli utenti dovrà esserci un campo che specifica se l'account è bloccato o no e va settato come bloccato, così quando verifichi il login oltre a username e pass verifichi anche cosa dice questo campo.
    Quando l'utente seguirà la procedura per sbloccarlo (vedi tu come vuoi farla) imposti il campo per sbloccare l'account.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Concordo con @Alhazred e propongo anche un'alternativa: ad ogni tenativo di login incrementi di 1 il valore di una variabile di sessione... se arriva a "3" si effettua il reset della password (ed eventualmente si invia una mail di avviso e si aggiorna il db anche con uno status di "blocked")

  4. #4
    Io penserei più di due giorni prima di creare una cosa del genere...metti caso che io volessi "rompere" un po', mi basta fare 3 tentativi e l'altro utente prima di accedere al tuo sito deve andare a sbloccare l'account dalla e-mail. Non sono sicuro che è qualcosa di gradito.

  5. #5
    Grazie per le risposte ma ancora non riesco ad uscirne, comunque pensavo di resettare la password dopo 3 tentativi falliti. Se "qualcuno" vuole rompere deve conoscere intanto l'username esatto e dovrebbe anche sapere che è previsto il blocco dopo 3 tentativi.

  6. #6
    penso che quello lo dovresti dire a tutti gli utenti a titolo informativo. Quindi se è un tuo utente (quindi può accedere al sito) penso possa vedere i nominativi degli altri e pertanto fare lo scherzetto. Se mi sbaglio correggi

  7. #7
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Originariamente inviato da Longo8
    penso che quello lo dovresti dire a tutti gli utenti a titolo informativo.
    E perché dovresti dirglielo? Una volta che l'account viene bloccato gli mandi una email con un link per il reset del contatore (magari con qualche altra opzione di verifica)

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    197
    mi interesserebbe il pezzo recupero password se puoi postalo...
    G181

  9. #9
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Originariamente inviato da eiyen
    Concordo con @Alhazred e propongo anche un'alternativa: ad ogni tenativo di login incrementi di 1 il valore di una variabile di sessione... se arriva a "3" si effettua il reset della password (ed eventualmente si invia una mail di avviso e si aggiorna il db anche con uno status di "blocked")
    La variabile di sessione funzionerebbe anche, ma fino ad un certo punto.
    Un utente smaliziato chiuderebbe il browser al 2° tentativo fallito distruggendo così la sessione e ripartendo da 0.
    Se il contatore è sul DB invece non può farci niente.

  10. #10
    a parte che secondo me lo dovrebbero sapere, non vedo l'utilità ti tale script. Se è per bloccare gli attacchi "brutes force" ci sono altri metodi efficaci che non mettono alla prova la pazienza dell'utente.
    Come posso inserire il reset della password dopo 3 tentativi di login falliti?
    Cosa intendi per reset? che si azzera o che manderai una nuova password tramite e-mail generata casualmente?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.