Questo post è rivolto a chi si avvicina alla programmazione in php per creare piccoli siti.
Una cosa simpatica ed a volte utile è non permettere la visualizzazione di alcuni contenuti se non si hanno delle credenziali di accesso.
Se si hanno dati importanti la cosa più sicura è proteggere il percorso tramite htaccess, dunque lato server, ma per una protezione di basso livello basta creare una procedura di login magari con 2 o più livelli di autorizzazione.
Per fare questo abbiamo bisogno di un DB dove andare a salvare le varie login e password che si vogliono creare ed useremo le variabili di sessioni per l'accesso.
Da qui potete scaricare i file di esempio.
La tabella (io l'ho chiamata "user_" del DB "login_") che andremmo ad usare si comporrà dei seguenti campi:
id_ = univoco per ogni login di accesso ed è autoincrementale e chiave;
nome_= nome o user della login;
pass_= password inserita codificata in md5 (per maggiore sicurezza);
liv_= livello dell'utenza.
Naturalemte possono essere inseriti i campi che si vogliono a seconda delle esigenze o se si vogliono dare info aggiuntive dell'utente collegato.
Cominciamo:
Inseriamo nella tabella 2 righe una per una login di livello "admin", che può vedere tutto, ed una per un livello "user" che può vedere solamente determinate pagine.
Riga 1:
id_=1
nome_=prova
pass_=098f6bcd4621d373cade4e832627b4f6 (questa è la cifratura in md5 della stringa "test")
liv_=admin
Riga 2:
id_=2
nome_=prova1
pass_=098f6bcd4621d373cade4e832627b4f6 (questa è la cifratura in md5 della stringa "test")
liv_=user
le rispettive query di inserimento nel DB sono le seguenti:
insert into user_ (nome_, pass_, liv_) value ('prova', '098f6bcd4621d373cade4e832627b4f6', 'admin')
insert into user_ (nome_, pass_, liv_) value ('prova1', '098f6bcd4621d373cade4e832627b4f6', 'user')
P.S. Per cifrare una qualsiasi stringa si può usare il seguente codice:
<?php
$pass="test";
$passcifr=md5($pass);
echo $passcifr;
?>
inserendo al posto di test quello che si vuole. Se viene richiamata la pagina da browser si avrà a video il risultato.
Ora che abbiamo creato le login andiamo ad analizzare il codice delle varie pagine:
La pagina index.php (pagina principale) se ancora non si è loggati deve far visualizzare il form di login altrimenti fa visualizzare le info dell'utente loggato e un piccolo menù.
<?php include ("connessioneDB.php");
session_start();
if ($_SESSION[nome]==""){
?>
<form action="login.php" method="post">
User <input type="text" name="user" size="10"/>
Password <input type="password" name="password" size="10"/>
<input type="submit" value="entra" />
</form>
<?php
echo "$_REQUEST[esito]";
echo "<a href="http://www.stefano11.it">www.stefano11.it</a>";
} else {
echo "<p><a href="logout.php">logout</a> | <a href="admin.php">pagina admin</a> | <a href="user.php">pagina user</a></p>";
echo "sei loggato come nome: $_SESSION[nome] livello: $_SESSION[livello]";
}
?>
La prima riga della pagina include una pagina (connessioneDB), in questa pagina sono salvati i dati di accesso al DB.
<?php
$connessione = mysql_connect("localhost","root","pass");//IP database - utente proprietario DB - password DB
mysql_select_db("login_",$connessione);//nome DB
?>
La pagina più importante è la pagina login.php che si richiama quando si inseriscono le credenziali di accesso e si clicca su entra.
<?php include ("connessioneDB.php");?>
<?php
session_start();
ini_set('session.gc_maxlifetime', '3600');//imposta il limite massimo di durata della sessione
$user = $_POST[user];
$pass = $_POST[password];
$password = md5($pass);
$query = mysql_query("SELECT * FROM user_ where nome_='$user' and pass_='$password'",$connessione);
while($row=mysql_fetch_array($query)){
$collegato = $row[id_];
$_SESSION[livello] = $row[liv_];
$_SESSION[nome] = $row[nome_];
}
if ($collegato != ""){
$sess = session_id();
echo "<meta http-equiv="Refresh" content="0; url=index.php?sess=<?=$sess"/>";
}
else{
$esito="user o password errate";
echo "<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=index.php?esito=$esito">";
}
?>
Ora andando dal menù a richiamare le pagine admin.php o user.php se si è loggati come untente admin si potranno visualizzare entrambe, mentre se si è loggati come utente user non si avrà accesso alla pagina admin.php.
Ecco il codice delle due pagine in questione:
Pagina user:
<?php include ("connessioneDB.php");
session_start();
if ($_SESSION[nome]!=""){
echo "<p><a href="logout.php">logout</a> | <a href="admin.php">pagina admin</a> | <a href="user.php">pagina user</a></p>";
echo "PAGINA USER - puoi visualizzare questa pagina";
} else {
echo "non puoi visualizzare questa pagina, non sei loggato";
echo "<META HTTP-EQUIV="REFRESH" CONTENT="2; URL=index.php">";
}
Pagina admin:
<?php include ("connessioneDB.php");
session_start();
if ($_SESSION[livello]=="admin"){
echo "<p><a href="logout.php">logout</a> | <a href="admin.php">pagina admin</a> | <a href="user.php">pagina user</a></p>";
echo "PAGINA ADMIN - puoi visualizzare questa pagina";
} else {
echo "non puoi visualizzare questa pagina, non sei loggato come un utente admin";
echo "<META HTTP-EQUIV="REFRESH" CONTENT="2; URL=index.php">";
}