Ok dopo 2 giorni di studi ho fatto il seguente codice che sembra andare sia con sia senza cookies
lo posto sperando che sia utile poi se c'e' qualche buon sammaritano che controlla
che non abbia scritto delle cavolate sopratutto per quanto riguarda i problemi di sicurezza.
Ho creato un file login.php
con le funzioni
check_user che controllano sul db login e passowrd e se corretti aprano la sessione e nel caso ci sia la var remember anche i cookies di autologin
check_logged che ritorna 1 se si e' loggati 0 se non lo si e nel caso ci siano cookies di auto login rieffettua il login
logout che chiude la sessione e i cokkies di autologin
form_sessid che va messo dentro tutte le form per la propagazione dell'id di sessione se serve
link_sessid che aggiunge in fonda ai link la sessid se serve
Codice PHP:
<?php
function check_user ($login , $password, $remember = 0) {
global $sql_usertable;
if (strlen($login) == 0 or strlen ($password) == 0) {
return 0;
}
$sql="SELECT * FROM $sql_usertable WHERE login='$login'";
$result=mysql_query($sql)or die("Query non valida: " . mysql_error());
if (mysql_num_rows($result) != 1) {
return -1;
}
$riga = mysql_fetch_assoc($result);
if ($riga['pwd'] != md5($password)) {
return 0;
}
else {
$_SESSION['user']=$login;
$_SESSION['user_id']= $riga['id'];
$_SESSION['user_perm'] = $riga['perm'];
//creazione cookie per login automatico
if($remember == 1) {
$cok=md5($login_user)."%%".$pass_user;
setcookie("sav_user",$cok,time()+31536000);
}
return 1;
}
}
function check_logged() {
// se esiste la session user sono loggato
if (IsSet($_SESSION['user'])) {
return 1;
}
//controllo user e passwd da cookie
if(IsSet($_COOKIE['sav_user'])) {
$info_cok=$_COOKIE['sav_user'];
$cok_user=strtok($info_cok,"%%");
$cok_pass=strtok("%%");
return check_user ($cok_user , $cok_pass , 1);
}
return 0;
}
function logout($headerredirect) {
$_SESSION=array(); // Desetta tutte le variabili di sessione.
session_destroy(); // DISTRUGGE la sessione.
if(IsSet($_COOKIE['sav_user'])) { //se presente si distrugge il cookie di login automatico
$info_cok=$_COOKIE['sav_user'];
setcookie("sav_user",$info_cok,time()-31536000);
}
header("Location: $headerredirect"); //si ricarica la pagina di login
exit; //si termina lo script in modo da ritornare alla schermata di login
}
function form_sessid() {
if(!IsSet($_COOKIE['PHPSESSID'])) {//i cookie sono off, dobbiamo propagare noi il PHPSESSID
$sessid=session_id();
print("<input type=\"hidden\" name=\"PHPSESSID\" value=\"$sessid\" />");
}
return 0;
}
function link_sessid($link) {
if(!IsSet($_COOKIE['PHPSESSID'])) {//i cookie sono off, dobbiamo propagare noi il PHPSESSID
$sessid=session_id();
$pos = strpos($link, "?");
if ($pos === false)
$links .= $link.'?PHPSESSID='.$sessid;
else
$links .= $link.'&PHPSESSID='.$sessid;
return $links;
}
return $link;
}
?>
poi ho creato in index che utilizza il sopracitato modulo in questo modo
Codice PHP:
<?php
//dati login da modificare
$redirect="http://localhost/index.php";
$sql_host = "localhost";
$sql_dbname = "my_db";
$sql_usertable = "user";
$sql_user = "myuser";
$sql_pwd = "";
include 'login.php';
session_start(); //si inizia o continua la sessione
//logout
if($_GET['logout']==1) { logout($redirect); }
mysql_connect("$sql_host", "$sql_user", "$sql_pwd")or die("Non e' possibile connettersi al server SQL");
mysql_select_db("$sql_dbname")or die("non e' possibile selezionare il database");
//controllo user e passwd da login
if(IsSet($_POST['posted_username']) && IsSet($_POST['posted_password'])) {
$logged = check_user ($_POST['posted_username'], $_POST['posted_password']);
} else {
$logged = check_logged();
}
?>
<html>
<head>
</head>
<body>
<?php
if($logged != 1) { //non siamo loggati, pagina di login
if($_GET['nocookie']==1) { //i cookie sono off e si vuole ricordare il login
print("Spiacente, ma con i cookie disabilitati non posso fare i miracoli ;)
Attivali se vuoi ricordare il tuo login.
");
}
print("
<form method=\"post\" action=\"$redirect\">
username: <input type=\"text\" sixe=\"20\" name=\"posted_username\">
password: <input type=\"password\" size=\"20\" name=\"posted_password\">
ricordami: <input type=\"checkbox\" name=\"ricorda\" value=\"1\">
<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Loggami\">
");
form_sessid(); // se c'e' bisogno mette il PHPSESSID se no nada
print("</form>");
}
else {//siamo loggati pagina riservata
$username=$_SESSION['user'];
$permlevel=$_SESSION['user_perm'];
print("Il tuo ID ?: $PHPSESSID
");
print("Sei loggato come: $username
");
print("I tuoi permessi: $permlevel
");
$pag2link = link_sessid("pagina2.php"); // se c'e' bisogno aggiunge l'id se no il link rimane invariato
print("<a href=\"$pag2link\">pagina2</a>
");
print("<a href=\"$redirect?logout=1\">logout</a>");
}
?>
</body>
</html>
infine una pagina secondaria che ho chiamato pagina 2 che utlilizza le mie comodissime funzioni
Codice PHP:
<?php
//dati login da modificare
$redirect="http://localhost/index.php";
$sql_host = "localhost";
$sql_dbname = "my_db";
$sql_usertable = "user";
$sql_user = "myuser";
$sql_pwd = "";
include 'login.php';
session_start(); //si inizia o continua la sessione
mysql_connect("$sql_host", "$sql_user", "$sql_pwd")or die("Non e' possibile connettersi al server SQL");
mysql_select_db("$sql_dbname")or die("non e' possibile selezionare il database");
$logged = check_logged();
?>
<html>
<head>
</head>
<body>
<?php
if($logged != 1) { //non siamo loggati, pagina di login
echo "non sei loggato vai alla pagina di login";
exit();
}
else {//siamo loggati pagina riservata
$username=$_SESSION['user'];
$permlevel=$_SESSION['user_perm'];
print("Il tuo ID ?: $PHPSESSID
");
print("Sei loggato come: $username
");
print("I tuoi permessi: $permlevel
");
print("<a href=\"$redirect?logout=1\">logout</a>");
}
?>
</body>
</html>