Visualizzazione risultati 1 fino 5 di 5

Discussione: [php] salvare le sessioni sul database per incrementare la sicurezza

  1. #1
    Guest

    Predefinito [php] salvare le sessioni sul database per incrementare la sicurezza

    Ciao ragazzi, nel sito che sto costruendo ho creato una funzione di login che controlla se l'utente esiste e in tal
    caso crea una sessione e lo reindirizza alle pagine protette del sito. In ogni pagina si controlla se è settata la sessione
    in caso affermativo l'utente vede la pagina, altrimenti viene reindirizzato alla pagina di login.

    Ora sto cercando un modo per incrementare la sicurezza, e mi è venuto in mente questo:

    creo una nuova tabella che contiene un campo idSessione e un campo data che indica quando è stata fatta l'ultima azione,
    e ad ogni pagina oltre a controllare se esiste la sessione controllo se quell'id esiste nel db, se esiste allora l'utente può
    accedere alle pagine protette del sito.

    Che ne pensate?

    Nel frattempo vi mostro lo script di login attuale, l'unica precauzione presa e l'hash della password.

    Codice:
    	$email=$_POST["email"];
    	$passwd=md5($_POST["password"]);
    
            /*codice per connettersi al db, non lo mostro per brevità*/
    	$query_sql="SELECT * FROM admin WHERE admin_email='$email' AND admin_password='$passwd'";
    	$result=mysql_query($query_sql,$myconn);
    
    	$riga = mysql_fetch_array($result);
    	$id = $riga['id'];
    	if($id == null){
    		header("location: index.php?status=400");
    	}
    	else{
    		session_start();
    		$_SESSION['email']=$email;
    		$_SESSION['nome']=$riga['admin_name'];
    		header("location: home.php");
    	}

  2. #2
    Guest

    Predefinito

    Ciao, non riesco a capire in che modo questo procedimento migliora la sicurezza del sito :P Le sessioni puoi gestirle solo tu tramite PHP, il client non può avere accesso a queste informazioni, se non all'ID della sessione stessa che serve per andare a recuperare i dati, i quali vengono salvati solo sul server. La sessione inoltre viene eliminata ogni volta che il client si disconnette e ad ogni riconnessione l'ID cambia.
    Secondo me invece, le informazioni da controllare per incrementare il livello di sicurezza sono quelle visibili e modificabili dal client, come i cookie. Per esempio non è sicuro salvare dati come ID utente o username (soprattutto in chiaro) in un cookie, altrimenti questo potrebbe essere più o meno facilmente modificato dal client per avere accesso alle informazioni di un altro utente.

  3. #3
    Guest

    Predefinito

    Grazie noktalk per la risposta, quindi al posto di

    Codice:
    $_SESSION['email']=$email;
    sarebbe meglio scrivere

    Codice:
    $_SESSION['email']=md5(email);
    giusto? O è meglio cambiare anche il nome della sessione? Ci sono altre cose che posso fare per migliorare la sicurezza?

    Attualmente le pagine protette fanno questo controllo

    Codice:
    if(!isset($_SESSION['email']))
         header('Location: index.php')
    Come è migliorabile? Grazie

  4. #4
    Guest

    Predefinito

    No no, come ti ho detto la sessione puoi gestirla solo tu tramite PHP. Il discorso sul non salvare dati sensibili in chiaro è legato ai cookie, che sono informazioni direttamente accessibili al client. Il succo della questione è che sulla sessione non devi preoccuparti, è già molto sicura di suo ;)

    Una cosa che invece ho notato nel tuo script è questa:
    Codice PHP:
    $email=$_POST["email"];
    Questo non è per niente sicuro, in quanto rende il tuo script vulnerabile ad una SQL Injection. Infatti se io nel tuo form di login metto come e-mail
    Codice:
    ' OR TRUE LIMIT 0,1 #
    e fornisco una password nulla, la tua query SQL sarà:
    Codice:
    SELECT * FROM admin WHERE admin_email='' OR TRUE LIMIT 0,1 # ' AND admin_password='d41d8cd98f00b204e9800998ecf8427e'
    Quindi avrò sempre accesso all'account di qualcuno, senza dover conoscere e-mail o password (infatti tutto ciò dopo # viene considerato un commento da MySQL e quindi ignorato). Per questo devi effettuare un escape.

    Inoltre, ma questo non è un consiglio di sicurezza, usare le funzioni mysql_* non è consigliato in quanto non sono più supportate (funzionano comunque). Quindi se hai voglia magari guardati le funzioni di MySQLi.

    EDIT: visto che si tratta di una e-mail potresti anche effettuare una verifica sulla sua corretta struttura (quindi nome@dominio.com o altra estensione) mediante un'espressione regolare: questo troncherebbe subito il tentativo di SQL Injection che ti ho citato e aggiungerebbe un ulteriore livello di sicurezza al tuo script.
    Ultima modifica di noktalk : 01-11-2013 alle ore 17.23.00

  5. #5
    Guest

    Predefinito

    Grazie noktalk per la dritta :)

    Ho aggiunto un codice che rimuove i caratteri ' e = e ora quel tipo di attacco è scongiurato. Terrò a mente anche
    l'altro tuo consiglio, darò un'occhiata a mysqli

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •