Login + MySql + Sessioni + Livelli + Logout

Davide Rossitto

Nuovo Utente
5 Mar 2012
8
0
0
Salve ragazzi, sto facendo un sito internet e mi servirebbero delle dritte, magari una guida, su come creare un sistemi di login gestito con mysql, le sessioni e i livelli, ovvero distinguere e fare vedere una determinata pagina all'amministratore differenziandolo dal utente semplice. E poi naturalmente il logout.
Qualcuno è così gentile da darmi una mano?? Grazie mille in anticipo a tutti coloro che risponderanno al mio post.
 
ciao
un po' di pazienza, chi risponde sono tutti volontari.
comunque se cerchi sul forum il problema è stato trattato molte volte.
comunque per i livelli nella tabella chiamata (es) utenti oltre username password mettu un campo livelli con valori definiti, per cui se
livello= 0 accedi alle pag amministratore + alle pag utenti
livello = 1 accedi alla pagine utenti
 
info

ciao borgo-italia, ho cercato nel forum... ma non ho trovato nulla di definitivo... sempre discorso trattati a metà, mi puoi suggerire tu qualche link per trarre spunto?? grazie mille
 
ciao
ciao borgo-italia, ho cercato nel forum... ma non ho trovato nulla di definitivo... sempre discorso trattati a metà, mi puoi suggerire tu qualche link per trarre spunto?? grazie mille
credo che qualcosa di definitivo non riesca a trovarlo, i casi sono tanti e spesso diversi uno dall'altro.
ti consiglio di cominciare a mettere giu qualcosa (prendendo spunto da quanto hai trovato) e, se hai problemi, postare qui su mrwm, qualche anima pia che ti da una mano la trovi
 
info

allora ragazzi ho creato due pagine: index.php (la pagina riservata) e login.php (la pagina per la registrazione della sessione):

index.php
PHP:
<?php 
	session_start();
	if (!isset($_SESSION['login'])){
		
		exit("Accesso Negato. Per leggere questa pagina e' necessario fare il <a href='login.php'>login<a>");
		
	}
	
	echo("Pagina riservata. Contenuti riservati.");




?>

login.php
PHP:
<?php
	session_start();
	
	function loginform()
	{
		echo"<form action=\"\" method=\"post\">
			  Username: <input type=\"text\" name=\"username\">
			  Password: <input type=\"text\" name=\"password\">
			  <input type=\"submit\" name=\"login\" value=\"Login\">
			  </form>";	
	}
	
	function logoutform(){
		echo"<form action=\"\" method=\"post\">
			 <input type=\"submit\" name=\"logout\" value=\"Logout\">
			 </form>";	
		
	}
	
	function logout()
	{
		session_destroy();
	}
	
	function login($username, $password)
	{
		$pass=md5($password);
		require("config.php");
		mysql_select_db("aretusaw_portale");
		$result=mysql_query("SELECT * FROM USER WHERE username='$username' AND password='$pass'") or die (mysql_error());
		
		$count=mysql_num_rows($result);
		if ($count==1){
			$_SESSION['login']=$username;	
			echo("Login avvenuto");
		}
		else
		{
			echo("Login errato, controlla password e username");	
		}
	}
	
	
	
	
if (isset($_SESSION['login']))
	{
		echo("Sei loggato, puoi fare il logout cliccando sotto.");
		logoutform();	
	}	
	else
	{
		echo("Non sei loggato, fai il login");
		loginform();
	}

if ($_POST['login'])
	{
		echo("Login in corso..");
		login($POST['username'], $_POST['password']);
	
	}
	elseif($_POST['logout'])
	{
		echo("Stai facendo il logout");
		logout();
	}


?>

però c'è qualche errore e non riesco a capire dove?? mi date una mano??
 
info

ragazzi come posso fare ad aggiungere il controllo dei livelli dell'utente. Ovvero se è l'amministratore può vedere tutte le pagine, se invece è un utente semplice può vedere solo alcune pagine...
 
Ciao,
per i livelli devi avere un campo nella tabella USER con indicato il livello
puoi definire il campo INT 1 e mettere o 0 o 1 o 2 etc se pensi di fare piu di 10 livelli metti INT 2
oppure puoi usare ENUM e definirli "A","U","S"
come preferisci
poi lo devi estrarre quando fai il login e lo metti in sessione

PHP:
<?php

$result = mysql_query("SELECT * FROM USER WHERE username='$username' AND password='$pass'") or die(mysql_error());
$row = mysql_fetch_assoc($result);

$_SESSION['livello'] = $row['livello'];
?>

avendo il livello in sessione ci puoi fare quello che vuoi

PHP:
<?php
// puoi reindirizzare in base al livello 
if (isset($_SESSION['livello']) && $_SESSION['livello'] == "A") {
    header("location:pagina_per_il_livello_A.php");
}
// oppure 
echo "Questa la vedono tutti";

if (isset($_SESSION['livello']) && $_SESSION['livello'] == "A") {
    echo "Questa la vede solo il livello A";
}

echo "Anche questa la vedranno tutti";
?>
per aggiungere qualche funzione in piu a quello che hai gia fatto
potresti creare una tabella nel db dove memorizzare la sessione, subito dopo averla valorizzata

PHP:
<?php
//....
$count = mysql_num_rows($result);
if ($count == 1) {
    $row = mysql_fetch_assoc($result);
    $_SESSION['livello'] = $row['livello'];
    $_SESSION['login'] = $row['username'];
    // tabella username e data
    $q = "INSERT INTO SESSIONI SET username='$username', 
                              data = NOW()";
    $res = mysql_query($q);
    echo("Login avvenuto");
    // potresti reindirizzare alla pagina protetta al posto di echo ma senza stampare niente altro prima
    // header("location:paginaprivata.php");
}
//......
?>

poi puoi aggiungere una funzone di controllo che richiamerai in ogni pagina

PHP:
<?php

function autenticazione() {

    require("config.php");
    mysql_select_db("aretusaw_portale"); 
    // verifichi che l'utente sia in sessioni da meno di 20 minuti
    $query = "SELECT * FROM SESSIONI
                       WHERE username = " . $_SESSION['login'] . " &&
                             TIMESTAMPDIFF(MINUTE, data, NOW()) < 20";
    $res = mysql_query($query);

    if (mysql_num_rows($res) == 0) {
        // ripulisci le sessioni
        unset($_SESSION);
        // restituisci falso e esci
        return false;
    }
    // altrimenti
    // aggiorni la data di sessione dell'utente loggato
    $query = "UPDATE SESSIONI SET data = NOW()
                       WHERE username = " . $_SESSION['login'] . "";
    $res = mysql_query($query);
    // elimini le sessioni piu vecchie di 20 minuti
    $query = "DELETE FROM SESSIONI
                       WHERE TIMESTAMPDIFF(MINUTE, data, NOW()) > 20";
    $res = mysql_query($query);
    // restituisci vero
    
    // dovrai semmai eliminare il record anche nella funzione logout se lo fanno manualmente
    return true;
}
?>
La tua index diventera cosi:
PHP:
<?php
session_start();
// richiami il file delle funzioni
require_once 'login.php';
// richiami e verifichi la funzione autenticazione
if (!autenticazione()) {
    exit("Accesso Negato. Per leggere questa pagina e' necessario fare il <a href='login.php'>login<a>");
}
echo("Pagina riservata. Contenuti riservati.");
?>

in questo modo puoi anche

contare quanti utenti loggati ci sono online con SELECT count(*) FROM SESSIONI


Ho scritto senza testare tienine conto
 
info

Prima di tutto grazie per la tua gentile risposta, ti volevo chiedere, il secondo pezzo cod. php, lo metteresti al posto della pagina index.php?? Non sto riuscendo a capirlo... mi puoi spiegare meglio questa parte di cod.?? grazie sempre
 
ciao

se ti riferisci a questo

<?php
// puoi reindirizzare in base al livello
if (isset($_SESSION['livello']) && $_SESSION['livello'] == "A") {
header("location:una_pagina_per_il_livello_A.php");
}
// oppure
echo "Questa la vedono tutti";

if (isset($_SESSION['livello']) && $_SESSION['livello'] == "A") {
echo "Questa la vede solo il livello A";
}

echo "Anche questa la vedranno tutti";
?>

non deve sostituire niente sono esempi di come puoi sfruttare la sessione livello nella index o in altre pagine protette

Esempio con la tua index

PHP:
<?php 
    session_start();
    if (!isset($_SESSION['login'])){
        
        exit("Accesso Negato. Per leggere questa pagina e' necessario fare il <a href='login.php'>login<a>");
        
    }
    if (isset($_SESSION['livello']) && $_SESSION['livello'] == "A") {
        echo "Benvenuto Amministratore";
    } else {
        echo "Benvenuto Utente";
    }

?>
 
info

grazie per la tua risposta. Ho risolto così con la index.php:
PHP:
<?php 
	session_start();
	
if (isset($_SESSION['livello']) && $_SESSION['livello'] == "1") { 
    header("location:admin.php"); 
}
elseif(isset($_SESSION['livello']) && $_SESSION['livello'] == "0") { 
    header("location:utente.php"); 
} else{

    header("location:login.php"); 

	}

?>
Che ne pensi?? Oggi prova anke la funziona ke mi hai suggerito di fare... Ma un'altra cosa: per evitare sql injection cosa posso mettere?? mi sembra che ci siano delle tecniche. Insomma dal punto di vista della sicurezza cosa posso migliorare secondo te?
 
ciao
usa htlmspecialchar
es.

PHP:
$pass=htmlspeciachars($_POST['password']);

poi salva la password codificata con sha1()

PHP:
$query="INSERT INTO user (....,password,....) VALUE(.....,sah1($pass),...)";
 
Che ne pensi??

Molto bene!

volendo puoi controllare tutti i post in un colpo solo con un ciclo

PHP:
<?php
foreach ($_POST as $key => $value) {
    $_POST[$key] = htmlspecialchars($value);
}
?>
 
ciao
io ho semplifico ulteriormente considerato che scrivere
PHP:
$q="SELECT * FROM tabella WHERE pass='$password'";
è più sempliche che scrivere
PHP:
$q="SELECT * FROM tabella WHERE pass='".$_POST['password']."'";
con l'aggiunta della codifica
PHP:
<?php 
foreach ($_POST as $key => $value) { 
    ${$key} = htmlspecialchars($value);
	if($key="password"){${$key}=sha1(${$key);}
} 
?>
quindi mi ritrovo tante variabili con nome uguale alla chiave dei post
 
@borgo
Ottima idea!

Ti eri dimenticato una } e il doppio == nella if

PHP:
<?php
foreach ($_POST as $key => $value) {
    ${$key} = htmlspecialchars($value);
    if ($key == "password") {
        ${$key} = sha1($value);
    }
}
?>
 
Ciao

ok funziona correttamente... ma ke ne pensate?? cosa migliorereste??


Ciao,

Ho provato il tuo codice, ma a me non funziona. Non mi fa entrare. Non capisco il perchè :( Te lo posto, se tante volte gli vuoi dare un'occhiata e trovi qualche errore. non si sa mai.... Grazie.

PHP:
<?php

require_once("connetti.php");

    session_start();
    
    function loginform()
    {
        echo"<form action=\"\" method=\"post\">
            <center>
              Username: <input type=\"text\" name=\"username\"> <br> <br>
              Password: <input type=\"password\" name=\"password\"> <br> <br>
              <input type=\"submit\" name=\"login\" value=\"Login\">
              </form>
              </center>";    
    }
    
    function logoutform(){
        echo"<center> <form action=\"\" method=\"post\">
             <input type=\"submit\" name=\"logout\" value=\"Logout\">
             </form> <7center>";    
        
    }
    
    function logout()
    {
        session_destroy();
    }
    
    function login($username, $password)
    {
        $pass=md5($password);
       // require("config.php");
       // mysql_select_db("aretusaw_portale");  <---> a cosa serve questa riga ?????
        $result=mysql_query("SELECT * FROM utenti WHERE username='$username' AND password='$pass'") or die (mysql_error());
        
        $count=mysql_num_rows($result);
        if ($count==1){
            $_SESSION['login']=$username;    
            echo("Login avvenuto");
        }
        else
        {
            echo("Login errato, controlla password e username");    
        }
    }
    
    
    
    
if (isset($_SESSION['login']))
    {
        echo("Sei loggato, puoi fare il logout cliccando sotto.");
        logoutform();    
    }    
    else
    {
        echo("Non sei loggato, fai il login");
        loginform();
    }

if ($_POST['login'])
    {
        echo("Login in corso..");
        login($POST['username'], $_POST['password']); <------> e poi il mio edito mi da un cartellino giallo anche se lo fa girare ugualmente.
    
    }
    elseif($_POST['logout'])
    {
        echo("Stai facendo il logout");
        logout();
    }


?>
 

Discussioni simili