• User Attivo

    Problema cookie in area riservata

    Ho un area riservata utile per far accedere poche persone, quindi senza form di registrazione, ma con un foglio php che contiene i dati di accesso dei veri utenti.
    Ho notato che se lascio aperta la finestra e apro più schede mi continuano ad aprirsi le pagine private, ma se anche per un secondo chiudo la finestra, riaprendone un'altra allo stesso indirizzo bisogna ripetere ogni volta il login.
    Ho pensato si potesse risolvere con i cookie, metto qui il codice, forse sbaglio con la sintassi o mancano proprio pezzi di codice?

    index.php
    [PHP]<?php
    session_start();
    include('users.php');
    if(isset($_SESSION['login']))
    if ($_COOKIE["login"] == "y")
    echo '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Area privata</title>
    </head>
    <body>
    Menu amministrazione
    <br />- <a href="index.php">Homepage</a>
    <br />- <a href="logout.php">Logout</a>
    </body>
    </html>';
    else
    echo '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Area pubblica</title>
    </head>
    <body>
    Menu pubblico
    <br />- <a href="index.php">Homepage</a>
    <br />- <a href="login.php">Login</a>
    </body>
    </html>';
    ?>[/PHP]

    login.php
    [PHP]<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Form di login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Username" /><br />
    <input name="pass" type="password" id="pass" value="Password" /><br />
    <input name="login" type="submit" style="width:100px;" value="Login" />
    </form>
    </body>
    </html>
    <?php
    session_start();
    if(isset($_POST['user']))
    {
    include('users.php');
    $c = count($utente);
    $i = 0;
    while($i < $c && $utente*['user'] != $user && $utente*['pass'] != $pass)
    $i++;
    if($i<$c)
    {
    $_SESSION['login'] = $utente*['id'];
    setcookie("login", "y", time() + 600);
    header('Location: index.php');
    exit;
    }
    else
    die('Username o password errati');
    }
    ?>[/PHP]

    users.php
    [PHP]<?php
    $utente[]=array('id' => '0', 'user' => 'user1', 'pass' => 'pass1');
    $utente[]=array('id' => '1', 'user' => 'user2', 'pass' => 'pass2');
    ?>[/PHP]

    logout.php
    [PHP]<?php
    session_start();
    include('users.php');
    session_destroy();
    setcookie("login");
    header('Location: index.php');
    exit;
    ?>[/PHP]

    Grazie a chi mi può dare una mano!


  • ModSenior

    Ciao Gigi991,

    stai facendo il controllo sul cookie dopo che fai il controllo sulla sessione per cui è normale che non superi il primo controllo.


  • User Attivo

    Ah..
    Effettivamente spostando nella sola pagina di login il controllo cookie prima dell'apertura della sessione funziona tutto come prima, ma mantiene aperta l'area riservata anche aprendo nuove finestre!

    Per voi sarà una cosa semplice, ma questa volta non mi spiego come ho fatto a farne una buona quasi da solo (contando la poszione sbagliata :P).

    Non ci sono altre cose da aggiungere allora, è giusto così?

    Grazie mille!


  • ModSenior

    Fai attenzione alla sicurezza, poichè è sufficiente impostarsi manualmente il cookie per poter accedere all'area riservata.
    Una soluzione più sicura sarebbe impostare 2 cookie uno con nome utente e uno con la password, ed in ogni pagina eseguire un controllo sulla validità di questi.


  • User Attivo

    Quindi del tipo:

    [PHP]if ($_COOKIE["nickname"] == $utente*['user'])
    if ($_COOKIE["password"] == $utente*['pass'])[/PHP]

    Al posto di:
    [PHP]if ($_COOKIE["login"] == "y")[/PHP]
    ?

    E nel login.php settare così:
    [PHP]setcookie("nickname", "$utente*['user']", time() + 600);
    setcookie("password", "$utente*['pass']", time() + 600);[/PHP]

    Ho provato in questo modo ma cliccando su accedi mi torna alla index visualizzando però il contenuto pubblico..


  • ModSenior

    Non ho capito il problema, ma comunque in quel modo dovrebbe dare errori di sintassi:
    [php]
    setcookie("nickname", $utente*['user'], time() + 600);
    setcookie("password", $utente*['pass'], time() + 600);
    [/php]


  • User Attivo

    Ho provato a correggere togliendo i doppi apici, ma il risultato è lo stesso.
    In pratica scrivo nickname e password esatti e reindirizza alla index.php, fin qui è giusto, solo che una volta reindirizzato alla index.php dovrebbe visualizzare il contenuto privato, mentre si vede ancora quello pubblico, come se non avessi effettuato il login. Provo a postare i nuovi codici

    index.php
    [PHP]<?php
    if ($_COOKIE["nickname"] == $utente*['user'])
    if ($_COOKIE["password"] == $utente*['pass'])
    session_start();
    include('users.php');
    if(isset($_SESSION['login']))
    echo '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Area privata</title>
    </head>
    <body>
    Menu amministrazione<br />- <a href="index.php">Homepage</a><br />- <a href="logout.php">Disconnetti</a>
    </body>
    </html>';

    else
    echo '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Area pubblica</title>
    </head>
    <body>
    Menu pubblico<br />- <a href="index.php">Homepage</a><br />- <a href="login.php">Connettiti</a>
    </body>
    </html>';
    ?>[/PHP]

    login.php
    [PHP]<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Form di login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Username" style="width:100px;font-family:Verdana;font-size:12px;font-weight:bold;color:#666666;" /><br />
    <input name="pass" type="password" id="pass" value="Password" style="width:100px;font-family:Verdana;font-size:12px;font-weight:bold;color:#666666;" /><br />
    <input name="login" type="submit" style="width:100px;" value="Login" />
    </form>
    </body>
    </html>
    <?php
    session_start();
    if(isset($_POST['user']))
    {
    include('users.php');
    $c = count($utente);
    $i = 0;
    while($i < $c && $utente*['user'] != $user && $utente*['pass'] != $pass)
    $i++;
    if($i<$c)
    {
    $_SESSION['login'] = $utente*['id'];
    setcookie("nickname", $utente*['user'], time() + 600);
    setcookie("password", $utente*['pass'], time() + 600);
    header('Location: index.php');
    exit;
    }
    else
    die('Username o assword errati');
    }
    ?>[/PHP]

    logout.php
    [PHP]<?php
    session_start();
    include('users.php');
    session_destroy();
    setcookie("nickname");
    setcookie("password");
    header('Location: index.php');
    exit;
    ?>[/PHP]

    Dove sbaglio?


  • ModSenior

    Ma $i non ha alcun valore...


  • User Attivo

    @Thedarkita said:

    Ma $i non ha alcun valore...

    Non viene impostato qui?
    [PHP]$c = count($utente);
    $i = 0;
    while($i < $c && $utente*['user'] != $user && $utente*['pass'] != $pass)
    $i++;[/PHP]

    In pratica era per dire di contare un utente per ogni riga presente nel file users.php, è sbagliato?


  • ModSenior

    In login.php si, ma in index.php no.


  • User Attivo

    Ho provato ora spostando il richiamo da users.php in alto, e togliendo $i,

    include('users.php');
    if ($_COOKIE["nickname"] == $utente['user'])
    if ($_COOKIE["password"] == $utente['pass'])
    session_start();
    if(isset($_SESSION['login']))

    Ma il risultato rimane comunque lo stesso, penso di sbagliare ancora nella index.php perchè controllando i cookie le informazioni su utente e password sono esatti. Solo non capisco come prelevare i dati due dati utili dall'array, facendo il controllo riga per riga..


  • ModSenior

    Se $utente è un array devi fare un ciclo per scorrerlo e controllare che ci sia un utente con quelle credenziali di accesso, come hai fatto in login.php.


  • User Attivo

    Ho riprovato ora a partire da 0 per riordinare un po le idee, e sono tornato al punto di dover modificare la index.php.
    Prima però ho provato lo script e noto ora che senza aver aggiunto la parte che richiede i cookie mi si apre la pagina privata anche cambiando finestre, chiudendo e riaprendo il tutto mi da l'effetto voluto, quando effettuo il login mi registra i due cookie con nickname e password e la sessione, e quindi si cancellano i due cookie quando faccio logout.
    Solo mi chiedo come mai funziona così come io voglio, quando nella pagina index.php non ci sono richieste di cookie? Questi i codici

    **index.php
    [php]<?php session_start();
    include('users.php');
    if(isset($_SESSION['login']))
    echo '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Area privata</title>
    </head>
    <body>
    Menu amministrazione<br />- <a href="index.php">Homepage</a><br />- <a href="logout.php">Logout</a>
    </body>
    </html>';
    else echo '<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Area pubblica</title>
    </head>
    <body>
    Menu pubblico<br />- <a href="index.php">Homepage</a><br />- <a href="login.php">Login</a>
    </body>
    </html>';
    exit; ?>[/php]

    login.php
    [php]<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Form di login</title>
    </head>
    <body>
    <form action="" method="post">
    <input name="user" type="text" id="user" value="Username" style="width:100px;font-family:Verdana;font-size:12px;font-weight:bold;color:#666666;" /><br />
    <input name="pass" type="password" id="pass" value="Password" style="width:100px;font-family:Verdana;font-size:12px;font-weight:bold;color:#666666;" /><br />
    <input name="login" type="submit" style="width:100px;" value="Login" />
    </form>
    </body>
    </html>
    <?php session_start();
    if(isset($_POST['user'])) {
    include('users.php');
    $c = count($utente);
    $i = 0;
    while($i < $c && $utente
    ['user'] != $user && $utente
    ['pass'] != $pass)
    $i++;
    if($i<$c) {
    $_SESSION['login'] = $utente*['id'];
    setcookie("nickname", $utente*['user'], time() + 120);
    setcookie("password", $utente*['pass'], time() + 120);
    header('Location: index.php');
    exit;
    }
    else die('Username o password errati');
    }?>[/php]**

    logout.php
    [php]<?php session_start();
    include('users.php');
    session_destroy();
    setcookie("nickname");
    setcookie("password");
    header('Location: index.php');
    exit; ?>[/php]

    users.php**
    [php]<?php $utente[]=array('id' => '0', 'user' => 'user0', 'pass' => 'pass0');
    $utente[]=array('id' => '1', 'user' => 'user1', 'pass' => 'pass1');
    $utente[]=array('id' => '2', 'user' => 'user2', 'pass' => 'pass2'); ?>[/php]

    E' comunque errato e c'è da aggiungere la richiesta nella index.php o va bene così?
    E se va bene, ora il problema dovuto alla sicurezza è risolto?


  • User Attivo

    Scusate il doppio post ma devo rettificare, lo script anche prendendo quello di partenza non va bene perchè basta inserire giusto o il nome utente o la password e si accede all'area privata, solo che per ogni utente deve effettuare l'accesso con la sola password presente nello setsso array, e non deve bastare un solo nickname o una sola password a caso per accedere..
    Dove ho sbagliato?