Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    14

    [Pillola] Gestione utenti e login senza sessioni, cookie o mysql

    Come creare un sistema di login e gestione utenti.

    Questa pillola si ispira ad una più vecchia che potete trovare qui ( http://forum.html.it/forum/showthrea...postid=2105665 ).
    Le caratteristiche sono:
    Gestione utenti attraverso registrazione ip
    Salvataggio su database sqlite (incluso in ogni versione di PHP 5)
    Multiutente (mi sembra il minimo)
    Supporto per più livelli utenti


    1. Per prima cosa creiamo un nuovo database e lo popoliamo con due tabelle:
    Tabella users con questa struttura

    #
    # Table structure for table: users
    #
    CREATE TABLE users ( name VARCHAR(20) NOT NULL PRIMARY KEY, pass VARCHAR(20) NOT NULL, level INT(1) NOT NULL, email VARCHAR(20) NOT NULL );
    # --------------------------------------------------------


    Tabella onlineuser con questa struttura

    #
    # Table structure for table: onlineuser
    #
    CREATE TABLE onlineuser ( name VARCHAR(20) NOT NULL PRIMARY KEY, ip VARCHAR(20) NOT NULL, time INT(10) NOT NULL );
    # --------------------------------------------------------


    2. Creiamo un file function.inc.php che conterrà tutte le funzioni


    Codice PHP:
    <?php
    //---------------------------
    //connessione al db
    function sqlite_connect() {
    $db_path 'login.db'// path del database
    $sq1 sqlite_open("$db_path"0666$sqlite_error);
    //in caso di errore
    if(!$sq1) {
     die(
    "error".$sqlite_error);
     } 
    return 
    $sq1;
    }

    //---------------------------
    function check($ip$ul) {
        
    $sq sqlite_connect(); // connessione db
        
    $queryou sqlite_fetch_array(sqlite_query($sq"SELECT name,time FROM onlineuser WHERE ip='$ip'"));
         if (
    $queryou == '') { 
        return 
    3// bisogna effettuare il login
         
    } else { 
        
    $time1 =  @time();
        if (
    $time1>$queryou['time']) { 
            return 
    3;
        } else {
            
    $username $queryou['name'];
        
    $queryu sqlite_fetch_array(sqlite_query($sq"SELECT level FROM users WHERE name='$username'"));
        if (
    $queryu['level'] == $ul) {
            
    $time = @time()+60*5;
            
    $updatetime sqlite_query($sq"UPDATE onlineuser SET time='$time' WHERE name='$username'");
            return 
    1;
        } else {
         return 
    2// non si hanno i privilegi
        

       }}
        
    sqlite_close($sq);
    }

    //---------------------------
    function login($ip) { 
    $sq sqlite_connect(); // connessione db
    $user $_POST['user'];
    $pass $_POST['pass'];
    //-- cancella vecchi utenti online
    $nw = @time();
    $querytime sqlite_query($sq"DELETE FROM onlineuser WHERE time<'$nw'");
    //---fine cancella vecchi utenti
    $queryexist sqlite_fetch_array(sqlite_query($sq"SELECT name,time FROM onlineuser WHERE ip='$ip'"));
    $querypass sqlite_fetch_array(sqlite_query($sq"SELECT pass FROM users WHERE name='$user'"));
    if (
    $queryexist != '') { 
     return 
    3// gia connesso
        
    } else { 
    if (
    $querypass['pass'] == md5($pass)) {
       
    $time = @time()+60*10;
       
    $queryinsert sqlite_query($sq"INSERT INTO onlineuser (name,ip,time) VALUES ('$user','$ip','$time')");
       if (
    $queryinsert){
         return 
    1; } else { //login effettuato
         
    return 4; } // errore di inserimento nel db
            
    } else {     
         return 
    2;  // password o nome sbagliati
        
    }}
    sqlite_close($sq);
    }

    //---------------------------
    function logout($ip) {
         
    $sq sqlite_connect(); // connessione db
         
    $querydelete sqlite_query($sq"DELETE FROM onlineuser WHERE ip='$ip'");
         if (
    $querydelete) {
             return 
    1//logout effettuato
         
    } else {
             return 
    2//errore nel logout
         
    }
         
    sqlite_close($sq);

    }

    //---------------------------
    function registration($ul) {
        
    $sq sqlite_connect(); // connessione db
        
    $name sqlite_escape_string(trim($_POST['name']));
        
    $pass sqlite_escape_string(trim($_POST['pass']));
        
    $mail sqlite_escape_string(trim($_POST['mail']));
        if (
    preg_match('/^[a-zA-Z0-9_]{4,28}$/',$name)) { // user da 4 a 28 alfanumerci con underscore
            
    if (preg_match('/^[A-Za-z0-9]{4,15}$/',$pass)) { // pass da 4 a 15
                
    if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$mail)) { // verifica se è una mail
                      
    $queryname sqlite_fetch_array(sqlite_query($sq"SELECT name FROM users WHERE name='$name'"));
                    if (!
    $queryname) {
                       
    $queryinsert sqlite_query($sq"INSERT INTO users (name,pass,level,email) VALUES ('$name','$pass','$ul','$mail')");
                          if (
    $queryinsert) {
                           return 
    1// registrazione avvenuta con successo
                         
    } else {
                          return 
    5; } // errore nell'inserimento
                    
    } else {
                        return 
    6; } // utente gia presente nel database
                
    } else { return 4; } // campo mail errato
            
    } else { return 3; } // campo pass errato
        
    } else { return 2; } // campo nome errato
    sqlite_close($sq);
        }
        
    //---------------------------
    function realip()
    {
        if (isset(
    $_SERVER['HTTP_X_FORWARDED_FOR']) == TRUE) {
            
    $ipaddress $_SERVER['HTTP_X_FORWARDED_FOR']; }
        if (isset(
    $_SERVER['HTTP_CLIENT_IP']) == TRUE) {
            
    $ipaddress $_SERVER['HTTP_CLIENT_IP']; }
            
    $ipaddress $_SERVER['REMOTE_ADDR'];
        return 
    $ipaddress;
    }
    $adip realip();
    //---------------------------
        
        
    ?>
    La funzione sqlite_connect crea una nuova connessione con il database e gestisce l'eventuale errore.

    La funzione check controlla se l'utente ha effettuato il login e se ha i privilegi necessari per accedere alla pagina. Restituisce 1 se l'utente puà visualizzare la pagina o un altro numero in relazione all'errore.

    La funzione login effettua l'inserimento (login) di un utente già registrato nella tabella onlineuser e cancella gli utenti che non sono più online.

    La funzione logout cancella l'utente che sta visualizzando la pagina dalla tabella onlineuser.

    La funzione registration verifica se i dati inviati dal form sono validi e li inserisce nel database. Eventualmente gestisce gli errori.

    La funzione realip restituisce l'ip corretto (se l'utente è dietro proxy restituisce il suo vero ip, non quello del proxy). Questa funzione non l'ho scritta io, ma ha sempre funzionato.


    3. Creiamo una pagina per il login



    Codice PHP:

    <?php
    if ( $_GET['login'] == 'ok') {
    include (
    'function.inc.php'); $login login($adip);
    if (
    $login == '2') { die ("I dati inseriti sono errati."); } // se i dati inseriti sono sbagliati
    if ($login == '3') { die ("Sei gia connesso."); } // se l'utente ha gia fatto il login precedentemente
    if ($login == '1') { die ("Login effettuato."); } // se il login è andato a buon fine 
    }?>



    Qui si inserisce la pagina di login con un form di questo tipo    
        
    <FORM action="login.php?login=ok" method="post"> Nick:<INPUT type="text" name="user"> Password:<INPUT type="password" name="pass"> <INPUT type="submit" value="Entra"> </FORM>

    Una pagina per la registrazione

    Codice PHP:
    <?php
    if ( $_GET['reg'] == 'ok') {
        
    $level '3'// livello di base di tutti gli utenti al momento dell'installazione
    include ('function.inc.php'); $reg registration($level);
    if (
    $reg == '5') { die ("Si è verificato un errore nell'inserimento."); } 
    if (
    $reg == '4') { die ("Inserira una mail corretta."); }  
    if (
    $reg == '2') { die ("Il Nome Utente deve essere alfanumerico e compreso tra i 4 ed i 28 caratteri, underscore compresi. "); } 
    if (
    $reg == '3') { die ("La password deve essere alfanumerica e compresa tra i 4 ed i 15 caratteri."); } 
    if (
    $reg == '1') { die ("Registrazione avvenuta con successo."); }  
    }
    ?>






     Compila il form per registrarti </p>

    <form method="post" action="registration.php?reg=ok" name="registration">
    Nome Utente:

      <input maxlength="28" name="name">

    Password:

      <input maxlength="15" name="pass" type="password">

    Email:

      <input name="mail">

      <input type="submit" value="Registrati">
    </form>

    Ed una per il logout


    Codice PHP:
    <?php 
    if ($_GET['logout'] == 'ok') {
        include (
    'function.inc.php'); $logout logout($adip);
        if (
    $logout == '1') { die ("Logout effettuato."); }
        if (
    $logout == '2') { die ("Errore nella procedura di logout."); }
    }
    ?>



     Per effettuare il logout fare click [url="logout.php?logout=ok"]qui[/url]</p>

    4. Ogni pagina che deve essere protetta deve avere un codice simile:



    Codice PHP:

    <?php
    $level
    '3'// qui si inserisce il livello o il gruppo associato agli utenti che possono visualizzare la pagina
    include ('function.inc.php'); $check check($adip$level);
    if (
    $check == '2') { die ("Non hai i privilegi per accedere alla pagina"); } // messaggio se il livello non corrisponde a quello dell'utente
    if ($check == '3') { die ("Per visualizzare questa pagina bisogna essere registrati ed aver effettuato il login."); } // messaggio se l'utente non ha ancora fatto il login
    ?>



    Qui si inserisce la pagina da proteggere



    Spero di esser stato utile. Per qualsiasi questione, chiedete pure.

    (Se i moderatori volessero marcare tale pillola come importante ne sarei veramente grato)

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Un po' cervellotica... io non mi fiderei mai di un sistema di riconoscimento basato sugli indirizzi ip.

  3. #3
    Codice PHP:
    $time = @time()+60*10



    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    14
    $time = time()+60*10;
    cosi è giusto?...


    GRazie.. di aver trovato un errore.
    Ho ancora molto da imparare

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    14
    Originariamente inviato da luca200
    Un po' cervellotica... io non mi fiderei mai di un sistema di riconoscimento basato sugli indirizzi ip.
    Perche quali sono i difetti?

    Altre idee di come implementare un sistame del genere?

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Il difetto è ovvio: chiunque lavori da una lan potrebbe avere grossi problemi.
    Tanto per cominciare, non tutti i proxy mostrano l'indirizzo interno delle richieste in arrivo da una LAN.
    Se l'indirizzo interno non viene mostrato, avrai un sistema a cui non possono collegarsi due utenti che provengono dalla stessa LAN.
    Se invece l'indirizzo viene mostrato, si creano possibili casi di indirizzo duplicato, visto che gli indirizzi di LAN non sono univoci all'esterno della LAN stessa. E queste possibili duplicazioni diventano molto probabili nel caso di piccole reti, che in genere usano indirizzi del tipo 192.168.0.*
    Se invece le reti sono grandi può essere che usino non uno ma più proxy, con la conseguenza che lo stesso utente potrebbe presentare indirizzi IP diversi (nel caso non venga mostrato quello interno) durante una sessione, con conseguente perdita del login.

    Certo, tutti questi problemi sparirebbero nel caso in cui l'applicazione giri internamente ad una LAN. Ma sarebbe comunque una limitazione.
    E poi un'applicazione, in quanto tale, ben difficilmente non avrà bisogno di memorizzare dati di vario genere relativi a ciascun utente collegato. Il che significa che le sessioni andranno utilizzate comunque.
    Ma poi, perché non volere usare le sessioni?

    Un'ultima cosa: la funzione realip(), per come l'hai scritta, non restituirà mai l'indirizzo interno della LAN, visto che l'ultima istruzione lo sovrascrive con l'indirizzo internet.

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.