• 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?