• User Attivo

    @Rapide said:

    Buongiorno a tutti, non so se qualcuno è ancora attivo in questa sezione, però io ci provo.
    Il problema che non riesco a risolvere questa volta è il seguente:
    Ho creato un piccola WebApp vorrei che gli utenti dovessero effettuare il login per accedere alla webapp, ma vorrei che il login fosse da effettuare una sola volta (anche ogni TOT, ma comunque non tutte le volte). Ho cercato con un disperato una soluzione sul Web, ma non riesco a risolvere il problema. E' una cosa possibile oppure no?

    Se l'utente non è loggato, controlli la presenza di un cookie, creato al momento del login. Il cookie conterrà nome utente e password, una volta estratti i dati fai un check sul database, se c'è il riscontro logghi l'utente.


  • User

    Ciao Supercapocc! Grazie mille per la risposta, ho provato a fare come suggerito e "ci siamo quasi"... Ho due piccoli dubbi ancora:

    1. A livello di sicurezza come siamo messi? Io per cercare di mantenere un livello "discreto" di sicurezza ho deciso di salvare la password nei cookie già criptata è sufficiente? (E' pur sempre vero che è un'applicazione per gestire le partite di calcetto, non contiene dati sensibili...);
    2. Mi funziona quasi tutto, tranne il riconoscimento dell'ID... Provo a postare alcuni estratti di codice, magari mi sfugge un errore banale...

    pagina di LOGIN (è solo un estratto quindi è normale che manchi il tag di chiusura PHP
    [PHP]<?php// Includo la connessione al databaseinclude 'connect.php';
    //FUNZIONE DI VERIFICA SESSIONE-COOKIESif (isset($_COOKIE['session'])) {
    header('Location: index.php');
    exit; }
    //FUNZIONE DI LOGIN
    // Se il modulo viene inviato...
    if(isset($_POST['login'])) {
    // Dati Inviati dal modulo
    $id = (isset($_POST['id'])) ? trim($_POST['id']) : '';
    $user = (isset($_POST['user'])) ? trim($_POST['user']) : '';
    $pass = (isset($_POST['pass'])) ? trim($_POST['pass']) : '';
    // Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza
    if (!get_magic_quotes_gpc()) {
    $id = addslashes($id);
    $user = addslashes($user);
    $pass = addslashes($pass);
    }
    // Crypto la password e la confronto con quella nel database
    $pass = md5($pass);
    // 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'];
    $_SESSION['user'] = $_POST['user']; $_SESSION['pass'] = md5($_POST['pass']);
    setcookie('session', $_SESSION['user'] && $_SESSION['pass'], time()+3600);
    // reindirizzo l'utente header('Location: index.php');
    exit;
    }
    // se non esiste da l'errore
    else {
    echo '<script type="text/javascript">alert("nome utente o password errati!");</script>'; }
    ;}[/PHP]

    Pagina profilo.php (ovvero una delle pagine private);
    [PHP]
    <?php
    // Includo la connessione al database
    include 'connect.php';
    //FUNZIONE DI VERIFICA SESSIONE-COOKIES
    if (isset($_COOKIE['session'])) {
    $idcookie = $_SESSION['login'];
    $usercookie = $_SESSION['user'];
    $passcookie = $_SESSION['pass'];
    // Controllo se i cookies corrispondono ad un utente registrato
    $query = mysql_query("SELECT id FROM utenti WHERE user = '$usercookie' AND pass = '$passcookie' LIMIT 1");
    if(mysql_num_rows($query) == 1) {
    // prelevo l'id dal database
    $result = mysql_query($query);
    while ($riga = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $idcookie = $riga['id'];
    }
    }
    }
    else {
    header ('location: login.php');
    exit;}
    [/PHP]


  • User

    #ERRATA CORRIGE
    scusa, ma sono stato troppo affrettato nel rispondere... Ho avuto modo di fare un po' di test. Su Desktop (mac e win) pare funzionare correttamente, mentre su tutti i dispositivi mobile funziona finché non chiudo definitivamente il browser. Forse è normale, ma sono certo che esiste un modo per risolvere questo problema, perché uso altri siti/WebbApp che non presentano questo problema, salvo impostazioni locali (cookies disabilitati o navigazione in incognito)... Cosa sbaglio? Considera che, me ne sono accorto adesso, non trovi il "session_start()" perché è inserito nel file connect.php, potrebbe essere questo il problema o uno dei?


  • User

    Buongiorno a tutti! Ultimo post poi passo e chiudo! Ho risolto ogni problema con un po' di intuito e qualche escamotage. Posto di seguito alcuni frammenti di codice che potrebbero tornare utili ai posteri:

    codice (commentato) per il login
    [PHP]<?php
    // Includo la connessione al database
    include 'connect.php';

    //FUNZIONE DI VERIFICA SESSIONE-COOKIES
    if (isset($_COOKIE['session'])) {
    header('Location: index.php');
    exit; }

    //FUNZIONE DI LOGIN
    // Se il modulo viene inviato...
    if(isset($_POST['login'])) {
    // Dati Inviati dal modulo
    $id = (isset($_POST['id'])) ? trim($_POST['id']) : ''; // Metto nella variabile 'pass' il dato inviato dal modulo, se non viene inviato dò di default ''
    $user = (isset($_POST['user'])) ? trim($_POST['user']) : ''; // Metto nella variabile 'user' il dato inviato dal modulo, se non viene inviato dò di default ''
    $pass = (isset($_POST['pass'])) ? trim($_POST['pass']) : ''; // 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()) {
    $id = addslashes($id);
    $user = addslashes($user);
    $pass = addslashes($pass);
    }

    // Crypto la password e la confronto con quella nel database
    $pass = md5($pass);

    // 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'];
    setcookie('session', $_SESSION['login'], time()+606024*365);
    // reindirizzo l'utente
    header('Location: index.php');
    exit;
    }
    // se non esiste da l'errore
    else {
    echo '<script type="text/javascript">alert("nome utente o password errati!");</script>';
    };
    }
    ?>[/PHP]

    codice (commentato) per l'autenticazione / by pass autenticazione utilizzando i cookies
    [PHP]<?php
    // SE L'UTENTE E' GIA' LOGGATO
    // Includo la connessione al database
    include 'connect.php';

    //FUNZIONE DI VERIFICA SESSIONE-COOKIES
    if (isset($_COOKIE['session'])) {
    $idcookie = $_COOKIE['session'];
    // Controllo se i cookies corrispondono ad un utente registrato
    $query = mysql_query("SELECT * FROM utenti WHERE id = '$idcookie' LIMIT 1");
    if(mysql_num_rows($query) == 1) {
    }
    }
    else {
    header ('location: login.php');
    exit;};
    ?>[/PHP]

    Fin qui tutto semplice e funzionante. Il problema sorge quanto da una pagina "privata" si vuole passare ad un'altra pagina privata senza un form e quindi un "post o get", ma con un semplice <a href ...>. Quello che occorre è:

    1. dettagliare il link come segue (ovvero aggiungendo il target)
      [HTML]<a class="privata" href="profilo.php" class="login" target="_top">PROFILO</a>[/HTML]

    2. Aggiungere nell'header di tutte le pagine "private" collegate fra di loro da semplici link <a href ...> il seguente script jquery

    <!-- SCRIPT CHE PREVIENE APERTURA DI LINK IN BROWSER -->
    <script type="text/javascript">
    $(document).ready(function(){
    if (("standalone" in window.navigator) && window.navigator.standalone) {
    // For WebApps
    $('a').on('click', function(e){
    e.preventDefault();
    var new_location = $(this).attr('href');
    if (new_location != undefined && new_location.substr(0, 1) != '#' && $(this).attr('data-method') == undefined){
    window.location = new_location;
    }
    });
    }
    });
    </script>
    
    

  • User Attivo

    Salve Rapide, non ho provato l'ultimo codice pubblicato ma ho dei dubbi su questa porzione di codice: @Rapide said:

    codice (commentato) per l'autenticazione / by pass autenticazione utilizzando i cookies [PHP]if(mysql_num_rows($query) == 1) { }[/PHP] Infatti se il DB contenesse l'istanza non verrebbe fatto nulla per memorizzare l'avvenuta autenticazione e quindi l'utente non risulterà mai loggato.


  • User

    @MenteLibera said:

    Salve Rapide, non ho provato l'ultimo codice pubblicato ma ho dei dubbi su questa porzione di codice: Infatti se il DB contenesse l'istanza non verrebbe fatto nulla per memorizzare l'avvenuta autenticazione e quindi l'utente non risulterà mai loggato.

    Ciao MenteLibera.
    In effetti si trattava di un refuso presente nel codice, che tuttavia non impediva il suo funzionamento, era solo un controllo inutile. Di fatto prendeva l'ID dell'utente precedentemente loggato (ID salvato nei cookies) e poi lo confrontava con il DB per verificare se esiste davvero. Se non esiste reindirizza alla login, diversamente non fa nulla e lascia proseguire il codice. Tuttavia è del tutto superfluo come controllo, il codice "sufficiente" è il seguente:

    [PHP]<?php
    // SE L'UTENTE E' GIA' LOGGATO
    // Includo la connessione al database
    include 'connect.php';

    //FUNZIONE DI VERIFICA SESSIONE-COOKIES
    if (isset($_COOKIE['session'])) {
    $idcookie = $_COOKIE['session'];
    // Estraggo l'ID dell'utente loggato partendo dai cookies
    mysql_query("SELECT * FROM utenti WHERE id = '$idcookie' LIMIT 1");
    }
    else {
    header ('location: login.php');
    exit;};
    ?>[/PHP]


  • User Attivo

    Un po' forzato il tutto, js è sicuramente evitabile. Se hai i cookie e già li usi non hai problemi ad usarlo per passati informazioni se ti mancano get/post...


  • User

    Ciao Gigi991, immaginvano che la mia "soluzione" fosse rudimentale, non son un grande esperto di PHP e JQuery. Tuttavia non comprendo appieno il tuo commento, JS lo uso esclusivamente per gestire i link <a href ...> e per creare avvisi in pop-up piuttosto che le classiche pagine di avviso bianche o similari che aumentano esponenzialmente il numero di click e rendono noioso sbagliare l'inserimento dati più di una volta...


  • User Attivo

    Non ho letto onestamente tutto il codice, mi riferivo al tuo commento:

    "Il problema sorge quanto da una pagina "privata" si vuole passare ad un'altra pagina privata senza un form e quindi un "post o get""

    Per passare da una pagina privata all'altra non hai bisogno di get o post, hai già una sessione attiva relativa all'utente.

    Se invece intendi il modo con cui si carica l'altra pagina è un altro discorso


  • User

    Ciao Gigi991 ora ho capito le tue perplessità... In effetti letta così, estrapolata dal contenuto, è una cavolata colossale. Il problema nasceva dal fatto che il tutto era costruito per una WEB APP, quindi si apre e usa a tutti gli effetti come un'app ma si "scarica" da internet non dallo store. Il problema ERA che al click sui "link semplici" anziché aprire il link/pagina all'interno della stessa Web App apriva il browser e mostra lì la nuova pagina. JS mi ha permesso semplicemente di bypassare questo problema visto che con metodi "tradizionali" non funzionava (target="_top", _self ecc...). Per l'ordinaria navigazione web sia da mobile che da desktop invece non ci sono mai stati problemi


  • User Attivo

    Ah perfetto. Detta così anzi la cosa interessa anche me, ho nella to do list di provare a fare una webapp ma i pochi tentativi fatti di seguire guide online son falliti. Se hai consigli o suggerimenti su guide a prova di stupido da seguire passo passo mi sarebbe parecchio d'aiuto 😄


  • User

    Io sono diventato matto per riuscirci, non ho trovato una sola guida che fosse utile, però mettendo insieme vari pezzettini sono riuscito a venirne a capo... Se hai bisogno questa volta forse potrò essere io di aiuto!


  • User Attivo

    Si guarda se riesci a fare una lista passo passo con la roba da installare e il setup di una webapp base che carica una pagina sarebbe già tanto..


  • User Attivo

    Ciao a tutti, sono consapevole che la discussione è molto vecchia, ma sarebbe interessante aggiornare il codice delle pagine per le nuove versioni in uso di php. Qualcuno può aiutarmi/ci in questo? grazie mille!


    giorgiotave 1 Risposta
  • Community Manager

    @robertocosenza ha detto in [Tutorial] Area privata:

    Ciao a tutti, sono consapevole che la discussione è molto vecchia, ma sarebbe interessante aggiornare il codice delle pagine per le nuove versioni in uso di php. Qualcuno può aiutarmi/ci in questo? grazie mille!

    Se qualcuno lo fa possiamo aprire una nuova discussione e spingerla 🙂


  • User Attivo

    Sarebbe semplicemente fantastico! 🙂