• User

    Script per login con password sha1

    Buonasera a tutti!

    Ho uno script per il login che fino a qualche giorno fa funzionava ora invece non funziona più.. praticamente fa entrare chiunque..

    Premetto che non mi serve una sicurezza eccessiva da hacker, ma un meccanismo per far entrare nel pannello di controllo solo l'amministratore quindi un nome utente e una password.. le ho caricate in un database cifrate in sha1.. e poi scritto questo codice..

    [PHP]<?php session_start();
    // inclusione del file di classe
    include "funzioni_mysql.php";
    // istanza della classe
    $data = new MysqlClass();
    // chiamata alla funzione di connessione
    $data->connetti();
    $utente = sha1($_POST['username']);
    $password = sha1($_post['password']);
    $product_sql = $data->query("SELECT ID FROM login WHERE username = '".$utente."' AND password = '".$password."' LIMIT 1");
    if(mysql_num_rows($product_sql) > 0){
    $product_obj = $data->estrai($product_sql);
    $id_log = $product_obj->ID;
    $logged = $product_obj->username;
    }
    if($id_log!=1) //se utente è un array vuoto
    {
    $msg = "Nome Utente o Password errati. Riprova";
    $msg = urlencode($msg);
    header("Location: login.php?msg=$msg"); //torna al form di autenticazione
    exit;
    }
    else {
    $_SESSION['login'] = 'verificata'; //memorizza in sessione i dati dell'utente
    $msg = "Benvenuto Alfredo!";
    $msg = urlencode($msg);
    header("Location: control_panel.php?msg=$msg"); //visualizza benvenuto
    }
    ?>[/PHP]

    Come mai qualunque cosa metto mi verifica la sessione e accede al pannello di controllo??? ❌x

    Ho provato a fare una echo dei dati utente e password dopo la cifratura....... e sono sempre gli stessi!!! qualunque cosa scrivo mi escono i valori che ho inserito nel database!!! la cifratura non è diversa in base a quello che scrivi?? cioè io scrivo ciao sarà cifrato in modo diverso da hello no??

    Non capisco perchè da ieri non funziona più....


  • User Attivo

    @NDakota said:

    Buonasera a tutti!

    Ho uno script per il login che fino a qualche giorno fa funzionava ora invece non funziona più.. praticamente fa entrare chiunque..

    Premetto che non mi serve una sicurezza eccessiva da hacker, ma un meccanismo per far entrare nel pannello di controllo solo l'amministratore quindi un nome utente e una password.. le ho caricate in un database cifrate in sha1.. e poi scritto questo codice..

    [PHP]<?php session_start();
    // inclusione del file di classe
    include "funzioni_mysql.php";
    // istanza della classe
    $data = new MysqlClass();
    // chiamata alla funzione di connessione
    $data->connetti();
    $utente = sha1($_POST['username']);
    $password = sha1($_post['password']);
    $product_sql = $data->query("SELECT ID FROM login WHERE username = '".$utente."' AND password = '".$password."' LIMIT 1");
    if(mysql_num_rows($product_sql) > 0){
    $product_obj = $data->estrai($product_sql);
    $id_log = $product_obj->ID;
    $logged = $product_obj->username;
    }
    if($id_log!=1) //se utente è un array vuoto
    {
    $msg = "Nome Utente o Password errati. Riprova";
    $msg = urlencode($msg);
    header("Location: login.php?msg=$msg"); //torna al form di autenticazione
    exit;
    }
    else {
    $_SESSION['login'] = 'verificata'; //memorizza in sessione i dati dell'utente
    $msg = "Benvenuto Alfredo!";
    $msg = urlencode($msg);
    header("Location: control_panel.php?msg=$msg"); //visualizza benvenuto
    }
    ?>[/PHP]

    Come mai qualunque cosa metto mi verifica la sessione e accede al pannello di controllo??? ❌x

    Ho provato a fare una echo dei dati utente e password dopo la cifratura....... e sono sempre gli stessi!!! qualunque cosa scrivo mi escono i valori che ho inserito nel database!!! la cifratura non è diversa in base a quello che scrivi?? cioè io scrivo ciao sarà cifrato in modo diverso da hello no??

    Non capisco perchè da ieri non funziona più....

    Non capisco il secondo controllo sul $log_id. Se i dati inseriti sono corretti (quindi viene trovato un record) non hai già concluso il controllo?
    Quindi includerei nel primo if la creazione della sessione, mettendo sotto un solo else con la generazione del messaggio di errore e il redirect. Così:

    [PHP]
    <?php session_start();
    // inclusione del file di classe
    include "funzioni_mysql.php";
    // istanza della classe
    $data = new MysqlClass();
    // chiamata alla funzione di connessione
    $data->connetti();
    $utente = sha1($_POST['username']);
    $password = sha1($_POST['password']);
    $product_sql = $data->query("SELECT ID FROM login WHERE username = '".$utente."' AND password = '".$password."' LIMIT 1");
    if(mysql_num_rows($product_sql) > 0){
    //Controllo sufficiente, se è maggiore di 0 esiste la corrispondenza
    $product_obj = $data->estrai($product_sql);
    $id_log = $product_obj->ID;
    $logged = $product_obj->username;
    //Creo qui la sessione valida e redirect al pannello di controllo
    $_SESSION['login'] = 'verificata'; //memorizza in sessione i dati dell'utente
    $msg = "Benvenuto Alfredo!";
    $msg = urlencode($msg);
    header("Location: control_panel.php?msg=$msg"); //visualizza benvenuto
    }
    else {
    //Se invece non trovo occorrenze, i dati saranno errati, errore e ritorno al login
    $msg = "Nome Utente o Password errati. Riprova";
    $msg = urlencode($msg);
    header("Location: login.php?msg=$msg"); //torna al form di autenticazione
    exit;
    }
    ?>
    [/PHP]

    Farei anche un check sui dati inseriti per evitare SQL Injections, è semplice ma fondamentale anche per l'uso che ne fai tu, o chiunque potrebbe rivoltarti il database sfruttando quel form. In generale ti suggerisco di prendere spunto da questo Tutorial area privata: giorgiotave.it/forum/scripting-e-risorse-utili/83033-tutorial-area-privata.html
    In particolare ad esempio la pagina login.php, il tutorial ha qualche anno ma dovrebbe proteggerti da questo problema.

    [PHP]if(isset($_POST['login'])) {
    //Se il modulo è stato inviato, procedo alla verifica

    // Dati Inviati dal modulo
    $utente = (isset($_POST['username'])) ? trim($_POST['username']) : '';    // Metto nella variabile 'user' il dato inviato dal modulo, se non viene inviato dò di default ''
    $password = (isset($_POST['password'])) ? trim($_POST['password']) : '';    // Metto nella variabile 'pass' il dato inviato dal modulo, se non viene inviato dò di default ''
    
    // Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza
    if (!get_magic_quotes_gpc()) {
        $utente = addslashes($utente);
        $password = addslashes($password);
    }
    

    //Qui il tuo script
    }[/PHP]


  • User

    Intanto ti ringrazio per l'aiuto e le correzioni.. ne terrò sicuramente conto e sistemerò tutto.. Ma non credo che questomi risolva il problema..

    Nello specifico praticamente le variabili $utente e $password assumono sempre lo stesso valore dopo la codifica sha1.. L'ho notato facendo l'echo delle 2 var subito dopo $password=sha1($_POST['password']); e mi vengono sempre le 2 var memorizzate nel db! Qualunque cosa io scriva nel form! Perché succede questo?


  • User

    AAAAHHHH!! Trovato!!! :arrabbiato:

    Nella cifratura della password avevo scritto $_post invece di $_POST.... ora funziona.. Grazie mille dell'aiuto!


  • User Attivo

    Ciao NDakota,
    sono felice che il tuo problema sia risolto positivamente 🙂

    Intervengo solamente con una parentesi per precisare che la funzione SHA-1 non ha lo scopo di cifrare una stringa, invece riporta il suo hash in base all'applicazione dell'algoritmo. Infatti da un hash non è possibile risalire ad un'unica stringa come avverrebbe per le vere funzioni di crittografia, ma ad un insieme che soddisfino l'algoritmo per quel caso particolare.

    Inoltre ci sono diversi documenti che sconsigliano quel tipo di funzione hash, mentre suggeriscono almeno SHA-2.

    Spero che ti possa essere utile.