Visualizzazione risultati 1 fino 6 di 6
Like Tree6Likes
  • 2 Post By soulcanada
  • 1 Post By soulcanada
  • 1 Post By
  • 1 Post By soulcanada
  • 1 Post By

Discussione: [php] Login in PHP e guida opensource

  1. #1
    L'avatar di soulcanada
    soulcanada non è connesso Utente giovane
    Data registrazione
    12-08-2011
    Messaggi
    75

    Lightbulb [php] Login in PHP e guida opensource

    Ciao ragazzi,
    è un pò che non scrivo (ma bazzico ancora) e colgo l'occasione per salutarvi tutti quanti.

    Per tutti quelli che mi conoscono sul forum sono uno di quelli che ha come chiodo fisso il login in PHP e sono sicuro che molti di voi, come me del resto, avranno pubblicato qualche guida e/o qualche script che permetta agli utenti di capire come funziona e come realizzarne uno.

    Tempo addietro il nostro alemoppo aveva realizzato e messo a disposizione di tutti noi questo script spiegandone nel dettaglio l'implementazione.

    Facendo una veloce ricerca su google e su questo forum è ormai assodato che il login in PHP è, probabilmente, il tema più caldo dell'intero panorama: uno dei thread che avevo iniziato e da cui ho avuto maggiore partecipazione (oltre 1milione di visualizzazioni) è sicuramente questo.

    Ora ho una nuova proposta e vorrei sapere cosa ne pensate: realizzare tutti insieme un innovativo sistema di login, opensource, che il resto del mondo possa utilizzare; nello specifico vorrei che venissero utilizzati i moderni standard dello sviluppo PHP tipo Composer, alcuni componenti di Symfony e seguire gli standard proposti dal PHP-FIG.

    La costruzione dell'intero sistema sarà accompagnata da una guida esaustiva (anch'essa open) che dovrà spiegare passo passo come si è scelto di implementare un certo componente e quale funzione svolge.

    Anche se molto altro ci sarebbe da dire, in sostanza la proposta è questa e vorrei sapere cosa ne pensate e se avete voglia di parteciparvi o se avete consigli/critiche/ecc...

    Cheers
    altermetax likes this.

  2. #2
    Guest

    Predefinito

    Ciao soulcanada! Io sono d'accordo e potrei partecipare al progetto. Sarei felice se si avverasse.

  3. #3
    L'avatar di soulcanada
    soulcanada non è connesso Utente giovane
    Data registrazione
    12-08-2011
    Messaggi
    75

    Predefinito

    Ciao a tutti,
    riprendo il post per segnalare un paio di aggiornamenti.

    Invece di iniziare un progetto da zero ho preferito riprendere la guida al login e registrazione utenti in PHP e MySQL che avevo proposto alcuni anni fa; dato che è passato del tempo, ho pensato fosse arrivato il momento di aggiornare la guida alle nuove versioni di PHP.

    Essendo poi questo un argomento molto richiesto ho deciso di mettere il progetto open-source, quindi potete forkare il repository che trovate a questo indirizzo https://bitbucket.org/soulcanada/login-guide e contribuire alla guida al login e registrazione utenti in PHP e MySQL.

    Inoltre ho provveduto ad includere nel repository anche i file stessi della guida in formato Markdown, formato di semplice consultazione e modifica mentre la versione HTML della stessa la trovate all'indirizzo http://phploginscript.altervista.org.

    Sto inoltre preparando un'aggiornamento che andrà a togliere l'utilizzo di funzioni ormai deprecati in favore di una migliore astrazione sui dati.

    Per qualsiasi commento non esitate a rispondere.

    Buona vigilia a tutti quanti.
    alemoppo and altermetax like this.

  4. #4
    Guest

    Predefinito

    Ciao,
    Io ti posso dire come faccio io, ho un progettino mio personale strutturato in model, view, controller, MVC, penso come hai fatto anche tu, non so però se la struttura è uguale, nella view ho tutti i file .php che includono solamente la classe template che mi serve per creare i template, non c'è codice di logica o espressioni di programmazione, ma solamente l'istanziamento della classe ed il passaggio delle variabili alla pagina HTML per creare l'html, i file HTML sono dentro una sottocartella nella view l'utente inserisce nome e password, con una chiamata Ajax invio i parametri al model al file configLogin.php...
    Config Login non fa altro che prendere le variabili utente e password istanzia una classe ed invoca il metodo convalidaLogin..

    Codice PHP:
    security_session();
    $utente = new utente();
    $convalidaLogin = new convalidaLogin();
    $userGet = $utente->recuperaUser();
    $passGet = $utente->recuperaPass();
    $convalidaLogin->convalidaLogin($userGet, $passGet);
    Codice PHP:

    class utente {

    private
    $username;
    private
    $password;

    public function
    __construct(){

    $userGet = trim($_POST['username']);
    $passGet = trim($_POST['password']);

    $this->username = $userGet;
    $this->password = $passGet;

    }

    public function
    recuperaUser(){
    return
    $this->username;
    }
    public function
    recuperaPass(){
    return
    $this->password;
    }

    }


    class
    convalidaLogin extends utente{

    function
    __construct(){
    parent::__construct();
    }

    public function
    convalidaLogin($userGet, $passGet){
    //error_reporting(E_ALL);
    $username = $userGet;
    $password = $passGet;

    if( !isset(
    $userGet) || empty($userGet) || trim($userGet)=='')
    {
    $msg = "|";
    $msg .="USER_VUOTO";
    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    exit;
    }

    if(!isset(
    $passGet) || empty($passGet) || trim($passGet)=='')
    {
    $msg = "|";
    $msg .="PASS_VUOTA";
    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    exit;
    }

    //Apriamo il Db PhpMyAdmin
    $db = new connessione();
    $db = $db->apriConnessione();

    //Caso errore connessione
    if ($db->connect_error) {
    $msg = "|";
    $msg .= "ERRORE_CONNESSIONE"."|";
    $msg .= "Impossibile connettersi a MySQL: (" . $db->connect_errno . ") " . $db->connect_error;

    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    exit;
    }

    $sql = $db->prepare("SELECT * FROM utenti WHERE username = ?");
    $sql -> bind_param('s', $username);

    $username = trim($userGet);
    $password = md5($passGet);

    $sql->execute();
    $sql->store_result();
    $sql->bind_result($id, $usernameDB, $profiloDB, $passwordDB);
    $sql->fetch();

    if (
    $sql->num_rows == 1){

    if(
    checkAssalto($id) == true) {
    $msg = "|";
    $msg .="ACCOUNT_DISABILITATO";
    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    exit;
    }
    else{
    if (
    $password == $passwordDB && strcmp($username, $usernameDB) == 0){
    //------------------------VALORI DELL'UTENZA-----------
    $user_browser = $_SERVER['HTTP_USER_AGENT'];
    $idUtente=$id;
    $profilo=$profiloDB;
    $username = $usernameDB;
    $stringaLogin = hash('md5', $passwordDB.$user_browser);
    //------------------------------------------------------
    $datiUtente = array('idUtente'=>$idUtente,
    'username'=>$username,
    'profilo'=>$profilo,
    'stringaLogin' => $stringaLogin);

    $_SESSION['datiUtente']=$datiUtente;

    $msg = "|";
    $msg .="OK";
    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    exit;
    }
    else {
    // Password incorretta.
    // Registriamo il tentativo fallito nel database.
    $now = time();
    $db->query("INSERT INTO miatabella (user_id, time) VALUES ('$id', '$now')");

    $msg = "|";
    $msg .="TENTATIVO_FALLITO";
    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    exit;
    }
    }
    }
    else{
    $msg = "|";
    $msg .="UTENTE_ASSENTE";
    $msg = str_replace("\n", "", $msg);
    $msg = str_replace("\r", "", $msg);
    print
    $msg;
    }
    //------------------
    //Chiude Mysql DB
    $db->close();
    exit;
    }
    }
    iMPORTANTE è la funzione check assalto in poche parole dopo 5 tentativi falliti blocco l'utenza per evitare gli assalti al DB che posso sbloccare solamente dal DB di altervista, le funzioni check assalto e la sessione sono definite nel file funzioni del MODEL..

    Codice PHP:
    function security_session(){
    $session_name = 'login_webLog'; // Imposta un nome di session
    $secure = false; // Imposta il parametro a true se vuoi usare il protocollo 'https'.
    $httponly = true; // Questo impedirà ad un javascript di essere in grado di accedere all'id di sessione.
    ini_set('session.use_only_cookies', 1); // Forza la sessione ad utilizzare solo i cookie.
    $cookieParams = session_get_cookie_params(); // Legge i parametri correnti relativi ai cookie.
    session_set_cookie_params(0);
    session_name($session_name); // Imposta il nome di sessione con quello prescelto all'inizio della funzione.
    session_start(); // Avvia la sessione php.
    session_regenerate_id();
    }
    //Check il login e reindirizza dalle pagine di View
    function checkLogin(){
    $server = $_SERVER['HTTP_HOST'];
    if (!isset(
    $_SESSION['datiUtente'])) {
    echo(
    'Non sei loggato, clicca il link sottostante per loggarti :' . '<br>');
    print(
    "<a href='http://$server/MvcWebLog/view/login.php'>Login</a>");
    exit ;
    }
    }

    //Dopo 5 tentativi falliti con un nome username blocca l'utenza sbloccabile solo da DB
    function checkAssalto($id) {
    //Recupero il timestamp
    $now = time();
    //Apriamo la connessione al DB
    $db=new connessione;
    $db = $db->apriConnessione();
    // Vengono analizzati tutti i tentativi di login a partire dalle ultime due ore.
    $valid_attempts = $now - (2 * 60 * 60);
    if (
    $stmt = $db->prepare("SELECT time FROM MIATABELLA WHERE user_id = ? AND time > '$valid_attempts'")) {

    $stmt->bind_param('i', $id);
    $stmt->execute();
    $stmt->store_result();
    //Se ci sono più di 5 tentativi dallo stesso ID return false e blocco

    if($stmt->num_rows > 5) {
    return
    true;
    } else {
    return
    false;
    }
    }
    }
    Ovviamente la check LOGIN è inclusa nel controller, tutte le informazioni passano dal Controller che le smista al Model, il model ha una sequenza in autoload spl_autoload_register ogni chiamata invocata da index.php invia al controller che a sua volta dirotta al model il quale effetua anch'esso un controllo e dinamicamente cerca il metodo corrispettivo nel model, ogni azione corrisponde ad un METODO nel model, se l'azione non esiste il model risponde azione errata...tutta la struttura è così, nel model ci sono metodi, che vengono poi invocati esempio da questa dicitura:

    http://fractalcosmo.altervista.org/M...p/azione=prova

    prova corrisponde ad un metodo nel file incluso nella cartella model, dentro la cartella model c'è il cuore del progetto, quindi tutto l'interfacciamento con il DB, nel model non ci sono molti file ma due file e dentro questi due file c'è una classe che include i metodi che vengono invocati dinamicamente dall'autoload, non ho fatto 50 file nel model, io in questo modo a progetto ingrandito se devo capire in quale punto del progetto devo intervenire so già che ogni volta che invoco da Ajax azione=MIAAZIONE, ed includo il file del model, so già che dovrò andare in quel file al metodo che si chiama MIAAZIONE..non so se è sicuro al 100% ma per il momento sembra che non me l'hanno bucato :)

    Un link interessante dove io ho appreso l'idea del checkAssalto è questo link:

    http://it.wikihow.com/Creare-uno-Scr...do-PHP-e-MySQL

    Ciao
    Ultima modifica di fractalcosmo : 28-12-2015 alle ore 01.24.34
    altermetax likes this.

  5. #5
    L'avatar di soulcanada
    soulcanada non è connesso Utente giovane
    Data registrazione
    12-08-2011
    Messaggi
    75

    Predefinito

    Ciao fractalcosmo e grazie per gli esempi che hai citato.

    Nelle versioni successive della guida ho intenzione di introdurre il concetto di pattern MVC e l'utilizzo di algoritmi che permettano di bloccare temporaneamente i login sospetti; la guida però è pensata per un pubblico che si sta avvicinando al mondo PHP e cerco quindi di introdurre nuovi concetti in modo graduale, non voglio che i lettori possano perdersi durante la lettura.

    Come dicevo prima però, alcuni dei concetti che hai postato sono interessanti e sicuramente verranno implementati.

    Se vuoi puoi collaborare allo sviluppo delle future versioni proponendo le tue idee e suggerimenti.
    altermetax likes this.

  6. #6
    Guest

    Predefinito

    Ciao Soul,
    Grazie per l'invito purtroppo il lavoro mi impedisce di essere attivo allo sviluppo extra lavorativo(anche il mio progettino palestra è fermo da diversi mesi), qui mi fanno lavorare :)
    Se vuoi, appena riesco, posso mandarti in generale la struttura che ho creato per l'MVC le tre cartelle, giusto per vedere quello che ho fatto io, tu puoi implementarlo ancora meglio.
    Fondamentalmente il controller passa la variabile $azione al model ed il model riceve la variabile $azione in get o post e dinamicamente prende la variabile e la switcha ai relativi metodi se esistono ovviamente, grazie alla funzione method_exists, fa un ciclo e dice se trovi il metodo invocalo...Poi entra dentro il metodo, fa tutto quello che deve fare e risponde al client.
    Ovviamente l'ho strutturato io non è un pattern evoluto....È una struttura personale di MVC senza usare pattern già prefissati, ma io l'ho fatto per fare palestra...Se vuoi ti posto il codice della struttura con una chiamata.
    Ciao buona giornata e auguri di buon anno.
    altermetax likes this.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •