• User Attivo

    Area privata senza database

    Salve a tutti!

    Dopo alcuni chiarimenti e la conferma di una possibile modifica dello script sull'area privata creato da TheDarkITA ([Tutorial] Area privata), mantenendo lo stesso livello di sicurezza e velocità (solo se usato con pochi utenti), apro questa discussione per provare ad abbozzare delle idee o pezzi di codice che potrebbero essere utili, sperando di non dire troppe cavolate :bigsmile:

    Prima di tutto mi servirà un foglio php che contiene tutti i dati dei vari utenti, avevo pensato a degli array, del tipo:

    utenti.php
    [PHP]$utente1=array("id1","user1","pass1");
    $utente2=array("id2","user2","pass2");[/PHP]

    Che viene poi richiamato nelle pagine di controllo con:

    protetta.php
    [PHP]fopen("utenti.php","a+");[/PHP]

    In modo che per ogni riga conti un utente..
    Ho già errato qualcosa, magari ci sono altri comandi più utili per l'adattamento, lo stesso per l'immagazzinamento dei dati, può andare bene un array di quel tipo?


  • ModSenior

    Ciao Gigi991,
    io, per facilitare la gestione, strutturerei il file utenti.php cosi:
    [php]
    $utenti[]=array('id' => 'id1', 'nomeutente' => 'user1', 'password' => 'pass1');
    $utenti[]=array('id' => 'id2', 'nomeutente' => 'user2', 'password' => 'pass2');
    [/php]


  • User Attivo

    Ok l'ho modificato, per quanto riguarda le pagine da proteggere, si usano sempre le sessioni come quello usato per i database?

    Tipo:

    protetta.php
    [PHP]<?php
    session_start();
    fopen("utenti.php","a+");
    if(isset($_SESSION['login']))
    echo 'Contenuto privato';
    else
    echo 'Contenuto pubblico';
    ?>[/PHP]

    Solo che ho il problema che nella pagina di login i dati da prelevare sono dal file e non dal database, come posso fare il controllo per vedere se i dati inseriti sono corretti dal file utenti.php?


  • ModSenior

    Si puoi usare le sessioni benissimo.
    Per il controllo devi scorrerti tutto l'array alla ricerca di una corrispondenza.


  • User Attivo

    [PHP]
    <?php
    session_start();
    fopen("utenti.php","a+");

    // Se il modulo viene inviato...
    if(isset($_POST['login']))
    {
    // Dati Inviati dal modulo
    $nomeutente = (isset($_POST['nomeutante'])) ? trim($_POST['nomeutente']) : ''; // 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()) {
        $nomeutente = addslashes($nomeutente);
        $password = addslashes($password);
    }
    
    // Crypto la password e la confronto con quella nel database
    $password = md5($password); [/PHP]
    

    Fino a qui mi pare dovrebbe essere tutto uguale, però ho problemi sulla modalità di controllo del file, ho provato a cercare con diverse parole chiave su google ma spiegano tutti come fare controlli di dati su database e non su file..

    Questo sarebbe il pezzo mancante, che preleva i dati dal database, e quindi da convertire con il prelievo dal file utenti.php:
    [PHP]
    // Controllo l'utente esiste
    $query = mysql_query("SELECT id FROM utenti WHERE user = '$user' AND pass = '$pass' LIMIT 1");

    // Se ha trovato un record
    if(mysql_num_rows($query) == 1)
    {
        // prelevo l'id dal database
        $login = mysql_fetch_array($query);
        
        // Creo una variabile di sessione
        $_SESSION['login'] = $login['id'];
    

    [/PHP]

    Poi la chiusura anche così mi sembra non ci sia da modificare nulla:
    <FONT color=#007700 face="Courier New">[PHP]
    // reindirizzo l'utente
    header('Location: privata.php');
    exit;
    }
    // se non esiste da l'errore
    else
    die('Nome Utente o Password errati');
    }
    ?>[/PHP]


  • ModSenior

    Dovrebbe essere all'incirca cosi:
    [php]
    include('utenti.php');
    $c = count($utenti);
    $i = 0;
    while($i < $c && $utenti*['nomeutente'] != $user && $utenti*['password'] != $pass)
    $i++;

    if($i<$c)
    {
    $_SESSION['login'] = $utenti*['id'];
    // reindirizzo l'utente
    header('Location: privata.php');
    exit;
    }
    // se non esiste da l'errore
    else
    die('Nome Utente o Password errati');
    [/php]


  • User Attivo

    Ho quindi i tre fogli:

    utenti.php:
    [php]<?php
    $utenti[]=array('id' => 'id1', 'nomeutente' => 'user1', 'password' => 'pass1');
    $utenti[]=array('id' => 'id2', 'nomeutente' => 'user2', 'password' => 'pass2');
    header('Location: login.php');
    exit;
    ?>[/php]

    protetta.php:
    [php]<?php
    session_start();
    fopen("utenti.php","a+");
    if(isset($_SESSION['login']))
    echo 'Contenuto privato';
    else
    echo 'Contenuto pubblico';
    ?>[/php]

    login.php:
    [php]<?php
    include('utenti.php');
    $c = count($utenti);
    $i = 0;
    while($i < $c && $utenti*['nomeutente'] != $user && $utenti*['password'] != $pass)
    $i++;
    if($i<$c)
    {
    $_SESSION['login'] = $utenti*['id'];
    // reindirizzo l'utente
    header('Location: protetta.php');
    exit;
    }
    // se non esiste da l'errore
    else
    die('Nome Utente o Password errati');
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Nome Utente" onfocus="if(this.value=='Nome Utente') this.value='';" /><br />
    <input name="pass" type="password" id="pass" value="Password" onfocus="if(this.value=='Password') this.value='';" /><br />
    <input name="login" type="submit" value="Login" /><br />
    </form>
    </body>
    </html>[/php]

    In questo modo però aprendo la pagina di login mi esce scritto: Nome Utente o Password errati.
    Ho saltato qualche pezzo? In pratica non carica il contenuto di body dando subito il messaggio di errore..


  • ModSenior

    In utenti.php le righe che fanno il redirect dovresti toglierle.
    Mentre in login.php dovresti controllare che il modulo sia inviato prima di fare le operazioni.


  • User Attivo

    Ah visto che ne hai parlato, in utenti.php avevo messo il redirect perchè aprendo appunto la pagina utenti.php rimaneva il foglio bianco, e quindi l'ho messo per reindirizzare chi ci potrebbe passare alla pagina di login. Disturba lo script in questo modo? Meglio che lo tolgo?

    Per la pagina di login efettivamente mettendo il codice sotto il form mi carica la pagina..
    Solo che inserendo nome e password di un utente mi reindirizza alla pagina protetta ma stampa il contenuto pubblico e non privato..


  • ModSenior

    Se vuoi mettere il redirect fai un controllo sull'url richiesto in modo da fare il redirect solo se viene richiesta quella pagina, altrimenti fai redirect ogni volta che usi il file in lettura.
    [php]
    <?php
    session_start();
    if(isset($_POST['user'])){
    include('utenti.php');
    $c = count($utenti);
    $i = 0;
    while($i < $c && $utenti*['nomeutente'] != $user && $utenti*['password'] != $pass)
    $i++;
    if($i<$c)
    {
    $_SESSION['login'] = $utenti*['id'];
    // reindirizzo l'utente
    header('Location: protetta.php');
    exit;
    }
    // se non esiste da l'errore
    else
    die('Nome Utente o Password errati');
    }
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Nome Utente" onfocus="if(this.value=='Nome Utente') this.value='';" /><br />
    <input name="pass" type="password" id="pass" value="Password" onfocus="if(this.value=='Password') this.value='';" /><br />
    <input name="login" type="submit" value="Login" /><br />
    </form>
    </body>
    </html>
    [/php]


  • User Attivo

    Ora va perfetto, ho provato anche la pagina di logout e almeno quella sono riuscito da solo 😄
    Per ora penso possa bastarmi questo, vedrò di adattarlo allo scopo che ho in mente, e in caso avessi problemi ritorno qui 🙂

    Grazie mille!


  • ModSenior

    Figurati.

    :ciauz:


  • User

    Ciao a tutti,
    mi sono appena iscritto in questo forum perchè è molto bello e molto utile per me che sono alle prime armi in php.
    A me serviva uno script di login senza database ed ho trovato questo,l'ho provato in locale e sul web ma al momento dell'invio dei dati non fa niente,cioè mi spiego meglio quando immetto i dati rimane la pagina del login e non mi dà nè Nome utente e password errati e nè mi indirizza alla pagina privata...Che devo fare?Da cosa è dovuto? Vi posto lo script.

    Login.php
    [PHP]<?php
    session_start();
    if(isset($_POST['user'])){
    include('utenti.php');
    $c = count($utenti);
    $i = 0;
    while($i < $c && $utenti*['nomeutente'] != $user && $utenti*['password'] != $pass)
    $i++;
    if($i<$c)
    {
    $_SESSION['login'] = $utenti*['id'];
    // reindirizzo l'utente
    header('Location: privata.php');

    // se non esiste da l'errore
    

    }else{
    die('Nome Utente o Password errati');
    }}
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Nome Utente" onFocus="if(this.value=='Nome Utente') this.value='';" /><br />
    <input name="pass" type="password" id="pass" value="Password" onFocus="if(this.value=='Password') this.value='';" /><br />
    <input name="login" type="submit" value="Login" /><br />
    </form>
    </body>
    </html>[/PHP]

    Ah,un'ultima cosa ma per il file utenti nome utente e password gli devo scrivere a mano giusto? se è così in quali campi devo scriverli?

    Scusate se sto facendo domande da vero principiante ma la verità è che sto alle prime con il php...
    Grazie e spero mi rispondiate...
    Stek:ciauz:


  • User

    Ciao a tutti volevo sapere come devo fare ad aggiungere nomeutente e password al file utenti.php....mi potreste dare una mano??
    :ciauz:Grazie mille:ciauz:


  • ModSenior

    [php]
    $utenti[]=array('id' => 1, 'nomeutente' => 'nomeutente1', 'password' => 'password1');
    $utenti[]=array('id' => 2, 'nomeutente' => 'nomeutente2', 'password' => 'password2');
    [/php]


  • User

    Grazie TheDarkita,
    il file ce l'ho pure io, solo che non ho capito dove devo inserire i dati di ogni utente...quindi password e user.....non è che mi pioi fare un'esempio?
    grazie stek


  • ModSenior

    L'esempio è proprio quello invece di nomeutente1, devi mettere il nome utente dell'utente 1, in password1 la password dell'utente 1, e cosi via...


  • User

    Grazie TheDarkita,
    ora provo...!


  • User

    Ciao TheDarkita,
    ho provato lo script on-line una volta modificato il file utenti.php,sono andato a vedere se mi faceva entrare ma mi dice sempre:Nome utente o password errati...Che devo fare? Posto il codice...

    Login.php:
    [php]<?php
    session_start();
    if(isset($_POST['user'])){
    include('utenti.php');
    $c = count($utenti);
    $i = 0;
    while($i < $c && $utenti*['nomeutente'] != $user && $utenti*['password'] != $pass) $i++;
    if($i < $c)
    {
    $_SESSION['login'] = $utenti*['id'];
    // reindirizzo l'utente
    header('Location: protetta.php');
    exit;
    }
    // se non esiste da l'errore
    else
    die ('Nome Utente o Password errati');

    }
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Nome Utente" onFocus="if(this.value=='Nome Utente') this.value='';" /><br />
    <input name="pass" type="password" id="pass" value="Password" onFocus="if(this.value=='Password') this.value='';" /><br />
    <input name="login" type="submit" value="Login" /><br />
    </form>
    </body>
    </html>[/php]utenti.php
    [php]<?php
    $utenti[]=array('id' => 1, 'nomeutente' => 'stefano', 'password' => 'stefano');
    $utenti[]=array('id' => 2, 'nomeutente' => 'nomeutente2', 'password' => 'password2');
    ?> [/php]Protetta.php:
    [php]<?php
    session_start();
    fopen("utenti.php","a+");
    if(isset($_SESSION['login']))
    echo 'Contenuto privato';
    else
    echo 'Contenuto pubblico';
    ?>
    [/php]Mi puoi dare una mano TheDarkita??
    Grazie Stek=)=)


  • User

    Ciao TheDarkita,
    sto provando a capire dov'è l'errore, ma non lo sto riuscendo a trovare...
    Mi potresti dare una dritta???
    Grazie Stek :ciauz: