ciao
ecco l'esempio di accesso ad una pagina riservata.
sono tre pagine:
1. la pagina che contiene il link con la richiesta di loggarsi (l'ho chiamata partenza.php)
2. la pagina di log che se tutto è ok presenta il form per loggarsi (l'ho chiamata loggati.php)
3. la pagina riservata (l'ho chiamata riservata.php)
il tutto si basa sul principio di creare una session random, che quindi si modifica ad ogni accesso e
verificare se quanto trasmesso dalla querystringa del link (prima nella loggati.php poi nella riservata.php) è uguale alla sessione.
da cui l'estrema difficoltà di accedere, sia al log che alla riservata, se non viene seguito esattamente il percorso partenza -> loggati -> riservata
ammesso che riesca a manipolare la sessione, è molto difficile azzeccare il suo valore codificato trasmesso con il get dato che questo cambia con la sessione ad ogni accesso
partenza.php
PHP:
<?php
if(!isset($_SESSION)){session_start ();}
$_SESSION['p']=rand(1000,10000);//genero un numero random e lo passo in sessione
//oppure al posto della riga sopra
//$_SESSION['p'] = uniqid(mt_rand());
?>
<!-- altre intestazioni -->
<body>
<!-- questa è la pagina di partenza con il link alla pagina di log per accesso a riservata-->
bla...bla...bla...
<p> </p>
<!-- trasmetto la sessione codificata tramite get -->
<p><a href="loggati.php?p=<?php echo md5($_SESSION['p']);?>">admin</a></p>
<!-- altri contenuti -->
bla...bla...bla...
</body>
loggati.php
PHP:
<?php
ob_start();
if(!isset($_SESSION)){session_start ();}
//user e pass provvisorie - poi saranno da ricavare da db
$user="pinco";//da togliere quando si usa il db
$pass="pallo";//da togliere quando si usa il db
echo "<head><title>{$_SESSION['p']}</title></head>";//imbroglio anche sul titolo della pagina, cambia ad ogni accesso
//verifico esistenza sessione, se uguale al get codificato e il nome della pag di provenienza
if(!isset($_SESSION['p']) || md5($_SESSION['p']) != $_GET['p'] || basename($_SERVER['HTTP_REFERER'])!= "partenza.php"){
//se la pagina che accede a questa non si chiama partenza.php modificare il nome nel basename(....
//comunque la parte || basename($_SERVER['HTTP_REFERER'])!= "partenza.php" è ridondante e si potrebbe togliere
$_SESSION=array();//elimino le eventuali sessioni
//questo per vedere l'effetto del tentativo di accesso diretto, poi sostituire con l'header location
echo "tentativo accesso";//dopo le prove commentare o eliminare
header( "refresh:3;url=partenza.php" );//dopo le prove commentare o eliminare
//header("location:partenza.php");//dopo le prove decommentare
exit();
}else{
echo <<< EOD
<p>per le prove: user = pinco , password = pallo</p>
<form name="form1" method="post" action="{$_SERVER['PHP_SELF']}">
<table width="45%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="16%">username</td>
<td width="84%"><input name="user" type="text" id="user"></td>
</tr>
<tr>
<td>password</td>
<td><input name="pass" type="password" id="pass"></td>
</tr>
<tr>
<td> </td>
<td><input name="log" type="submit" id="log" value="log"></td>
</tr>
</table>
</form>
EOD;
}
if(isset($_POST['log'])){
//dati di connessione per cercare user e pass nel db - possibilmente sostituire con la PDO
//require_once "connessione.php";
//passord con md5 o sah1
/*
$user=addslashes($_POST['user']);
$pass=sah1(addslashes($_POST['pass']));
$n=mysql_num_rows(mysql_query("SELECT * FROM utenti WHERE user='$user' AND pass='$pass'"));
if($n == 1){
*/
if(addslashes($_POST['user']) == $user && addslashes($_POST['pass'])== $pass){//riga da togliere quando si usa il db
$_SESSION['p']=rand(1000,10000);//rigenero una nuova sessione random questa non sto a codificarla
$_SESSION['user']=addslashes($_POST['user']);
header("location:riservata.php?r={$_SESSION['p']}");
}else{//pass e username non validi
$_SESSION=array();//elimino le sessioni
header("location:partenza.php");
exit();
}
}
ob_end_flush();
?>
riservata.php
PHP:
<?php
if(!isset($_SESSION)){session_start ();}
if(!isset($_SESSION['p']) || !isset($_SESSION['user']) || $_SESSION['p'] != $_GET['r']){
$_SESSION=array();//?? forse meglio distruggere solo la [p] e la [user] nel caso ne avessi altre che mi servono
header("location:partenza.php");
exit();
}else{
echo "<head><title>{$_SESSION['user']}</title></head>";
echo "ciao ".$_SESSION['user']." sei nella pagina riservata<br>";
//le righe sotto servono per le prove
echo "provengo da: ".basename($_SERVER['HTTP_REFERER'])." con vecchio rand<br>";
echo "la sessione rand è: ".$_SESSION['p']." <br>";
echo "uguale al get codificato: ".$_GET['r']."<br>";
echo "<p><a href=\"partenza.php\">esci</a></p>";
/* e tutto quello che serve sia php che html*/
}
?>
se vuoi usarla però devi modificare la loggati.php adattandola alla ricerca sul db (vedi commenti)
inoltre, se non ho fatto errori di copia incolla, lo scrip l'ho testato e funzia