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.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

Davide Rossitto

Nuovo Utente
5 Mar 2012
8
0
0
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

Davide Rossitto

Nuovo Utente
5 Mar 2012
8
0
0
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??
 

Davide Rossitto

Nuovo Utente
5 Mar 2012
8
0
0
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...
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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
 

Davide Rossitto

Nuovo Utente
5 Mar 2012
8
0
0
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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";
    }

?>
 

Davide Rossitto

Nuovo Utente
5 Mar 2012
8
0
0
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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),...)";
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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);
}
?>
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
@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);
    }
}
?>
 

paperinik4

Utente Attivo
29 Mag 2011
1.812
0
36
Roma
www.ricetteagogo.it
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
Autore Titolo Forum Risposte Data
E [PHP + MySql] Sito con login e sessioni PHP 8
M [PHP] Metodo migliore per fare login a un DB Mysql PHP 1
D problemi login php 5.6 mysql PHP 1
A Area riservata con login e mysql ma nn mi logga PHP 1
A Facebook login - memorizzazione su mysql Sviluppo app per Android 1
L classe per gestire login in mysql PHP 1
L login con pdo/mysql PHP 2
D Pagina login php-mysql PHP 1
I estrazione mysql in base al login PHP 77
L [PHP/MYSQL] Login con ricordo utente PHP 1
S Area riservata con login e mysql PHP 20
L Problemi con il login PHP 2
L login e session PHP 4
A Problema login con Safari PHP 14
R Reinderizzamento dopo login PHP 2
C finestra popup dopo login PHP 2
L login con solo un codice PHP 3
Web93 PROBLEMA SITO WEB WORDPRESS - LOGIN DASHBOARD Programmazione 3
M Login Autenticazione Sviluppo app per Android 0
M Effettuare Login con dati Json Sviluppo app per Android 0
S [PHP] Stampa a video Nome e Cognome in seguito a login PHP 1
M [PHP] header (location..) non funzionante dopo login PHP 3
L [PHP] Visualizzare utente dopo login PHP 0
L [PHP] login con password_verify PHP 3
A HTML issues with creating a register and login page + general questions HTML e CSS 1
L [PHP] login con varie entrate PHP 3
L [PHP] login con password_verify - password_hash PHP 5
M [PHP] Problemi con il riconoscimento login. PHP 21
F [PHP] Login senza database PHP 3
F [php] sicurezza password form login PHP 2
F Problema con pagine login in PHP PHP 2
Y [PHP] Errore di login dopo aver inserito Codice AdSense PHP 0
M [PHP] Problemi con login facebook PHP 0
Shyson [WordPress] Nascondere link del Login WordPress 2
W [PHP] Login sicuro al web Service SOAP PHP 20
P [PHP] Limitare login ad un solo utente per volta PHP 12
L [PHP] login e protezione pagine con session PHP 3
L [PHP] login con la classe medoo.in PHP 5
I [PHP] [Javascript] login da smartphone a web PHP 3
P [PHP] Reindirizzamento post Login PHP 3
I [PHP] login con sessione singola PHP 1
AkenStyle Login per gioco online Database 6
bubino8 [WordPress] [PHP] Login diretto da bottone WordPress 4
D [PHP] Login Multiutente con pagina privata PHP 5
I [PHP] Login Facebook SDK returned an error: No URL set! PHP 0
G PHP Login PHP 1
Laskot Login php e redirect PHP 1
K [PHP] Unica sessione login forum/sito PHP 1
bubino8 [WordPress] Login a WP da bottone WordPress 0
bubino8 [PHP] Login Automatico PHP 1

Discussioni simili