Newsgroup: it.comp.www.php
Titolo: Autenticazione, problema!!!

Sto creando un semplice script per nulla esigente per proteggere una
pagina.
Tralasciando la parte form circa la sicurezza che dopo modificherò, mi
spiegate dove sbaglio?
La connessione al db avviene, se la variabile $userid non è settata mi
appare il modulo di login ma se svolgo una qualsiasi operazione non
succede nulla e mi restituisce sempre la pagina di login.
Grazie Molte!!!
P.

thesn...@tiscali.it
 ha scritto:

Temo che se non posti qualche riga del codice otterrai ben poche info.
Saluti e buon divertimento ;-)

Ops...dimenticavo il codice :-D
<?php
$dbhost="localhost"; //Host datbase;
$dbusername="xxxxx"; //User per connessione al database;
$dbuserpassword="xxxxx"; //Password per connessione al database;
$default_dbname="xxxxx"; //Nome del database a cui connetersi;
$user_tablename="xxxxx";
$link_id=mysql_connect($dbhost, $dbusername, $dbuserpassword);
if(!$link_id) echo "Connessione fallita al database.";
    else echo "Connessione al database riuscita.";
mysql_select_db($default_dbname);
 function auth_user($userid, $userpassword){
 	global $default_dbname, $user_tablename;
 	$link_id = db_connect($default_dbname);
 	$query = "SELECT  FROM $user_tablename WHERE userid='$userid' AND
userpassword=password('$userpassword')";
 	$result=mysql_query($query);
 	if(!mysql_num_rows($result)) return 0;
 	else{
 		$query_data=mysql_fetch_row($result);
 		return $query_data[0];
  	}
 }
 function login_form(){
 	global $PHP_SELF;
?>
<html>
<head>
<meta http-equiv="Content-Language" content="en" />
<meta name="GENERATOR" content="PHPEclipse 1.0" />
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
<title>login</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966"
alink="#FFCC99">
  <form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
  <fieldset>
   <legend>Login</legend>
   <input type="text" name="userid">
   <input type="text" name="userpassword">
   <input type="submit" value="ENTRA">
  </fieldset>
</form>
</body>
</html>
<?php
 }
 //session_start();
 if(!isset($_SESSION['userid'])) {
 	login_form();
 } else{
 	session_register("userid", "userpassword");
    $username = auth_user($_SESSION['userid'],
$_SESSION['userpassword']);
    if(!$username){
    	session_unregister("userid");
    	session_unregister("userpassword");
    	echo "<p>Autenticazione fallita. Inserire nome utente e password
corrette e riprovare.</p>";
    	echo '<p><a href="'.$_SERVER['PHP_SELF'].'">Riprova</a></p>';
    }
    else
    echo "ok";
 }
 ?>

 userpassword=password('$userpassword')";
nella query dopo il select manca l'asterisco
Prova a fare queste modifiche e vedi se gira.

  	session_register("userid", "userpassword");
Non usare register_globals, e nemmeno session_register() e
session_unregister().
Bye.


Ops nel copia incolla e modificare alcune cose mi so perso qualcosa
per strada...corretto:
$query = "SELECT username  FROM $user_tablename WHERE userid='$userid'
AND userpassword=password('$userpassword')";
Purtroppo non succede nulla.
Tutto come prima.
gp


E come faccio a registrare le variabili di sessione e cancellarle?
Cioè, non vorrei rifare il login ad ogni cambio di pagina.
P.

 E come faccio a registrare le variabili di sessione e cancellarle?
http://it.php.net/manual/it/ref.session.php
Ciao


Dunque per registrare una sessione dovrei fare qualcosa del genere,
$_SESSION['userid']=$userid; ?
E per liberarle, session_unset() ?

 E per liberarle, session_unset() ?
unset() e basta.
session_unset() svuota tutta la sessione e la cancella.
Bye.

 E per liberarle, session_unset() ?
No, con unset come un normale array:
unset($_SESSION['userid'])
	Francesco

Pare ci sia riuscito ma ho dovuto inserire i valori e la connessione
al db all'interno della funzione auth_user...io invece li volevo
all'esterno per essere più portabile...ma vabbè.
E settare le variabili di sessione prima di effettuare if(!
isset($_SESSION['userid']){....}
Non so se potrebbe crearmi problemi.
Ecco il mio codice, secondo voi va discretamente bene e o cosa potrei
migliorare?
<?php
function auth_user($userid, $userpassword){
$dbhost="localhost"; //Host datbase;
$dbusername="xxxx"; //User per connessione al database;
$dbuserpassword="xxxx"; //Password per connessione al database;
$default_dbname="xxxx"; //Nome del database a cui connetersi;
$user_tablename="xxxx";
$link_id=mysql_connect($dbhost, $dbusername, $dbuserpassword);
if(!$link_id) echo "Connessione fallita al database.";
    else echo "Connessione al database riuscita.";
mysql_select_db($default_dbname,$link_id);
 	$query = "SELECT * FROM $user_tablename WHERE userid='$userid' AND
userpassword=password('$userpassword')";
 	$result=mysql_query($query);
 	if(!mysql_num_rows($result)) return 0;
 	else{
 		$query_data=mysql_fetch_row($result);
 		return $query_data[0];
  	}
}
?>
<?php
function login_form(){
?>
<html>
<head>
<meta http-equiv="Content-Language" content="en" />
<meta name="GENERATOR" content="PHPEclipse 1.0" />
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
<title>login</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966"
alink="#FFCC99">
  <form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
  <fieldset>
   <legend>Login</legend>
   <input type="text" name="userid">
   <input type="text" name="userpassword">
   <input type="submit" value="ENTRA" name="Submit">
  </fieldset>
</form>
</body>
</html>
<?php
 }
 $_SESSION['userid']=$_POST['userid'];
 $_SESSION['userpassword']=$_POST['userpassword'];
 if(!isset($_SESSION['userid'])) {
 	login_form();
 } else{
    $username = auth_user($_POST['userid'], $_POST['userpassword']);
    if(!$username){
    	unset($_SESSION['userid']);
    	unset($_SESSION['userpassword']);
    	echo "<p>Autenticazione fallita. Inserire nome utente e password
corrette e riprovare.</p>";
    	echo '<p><a href="'.$_SERVER['PHP_SELF'].'">Riprova</a></p>';
    }
    else
    echo "ok";
 }
 ?>
Grazie a tutti per i consigli che mi avete dato.
P.

 unset($_SESSION['userid'])
Questo sarebbe equivalente a:
$_SESSION = array();
giusto?
--
rob4you


Cioè no, scusate! :-)
--
rob4you

 migliorare?
Un sacco di cose :)
Visto che presumibilmente sara` una pagina di login te lo riporto senza
funzioni:
<?php
  session_start();
  if (isset($_POST["userid"]) {
    $link_id = mysql_connect($dbhost, ...) or die ("connessione fallita");
 
    $res = mysql_query("select * from user_table where "
           ." userid='" .mysql_real_escape_string($_POST["username"]). "'"
           ." and password='" .mysql_real_escape_string(_POST["password"]). "'";
    if (mysql_num_rows($res) > 0) {
      // Utente OK
      $_SESSION["utente"] = mysql_fetch_array($res, MYSQL_ASSOC);
      header("Location: " .$pagina_da_visualizzare);
    }
  }
?>
<form di registrazione>
Ho tagliato le variabili di connessione al DB, dipende da te come vuoi
passarle (io di solito uso una classe Config, quindi faccio
Config::get("db_user"), per esempio).
E ho tagliato anche il form che rimane praticamente identico.
Nota l'escape dei parametri, per evitare sql injection.
Non ti serve salvare username e password in sessione, ma puo` essere utile
salvare l'array dei dati dell'utente preso dal DB.
Per far fare il logout all'utente ti basta una pagina dove fai
<?php
  session_start();
  unset($_SESSION["utente"]);
  header("Location: " .$altra_pagina_dopo_logout);
?>
Nelle pagine che vuoi proteggere, controlla se esiste la variabile in
sessione:
<?php
  session_start();
  if ( ! isset($_SESSION["utente"])) {
   // utente non registrato
   header("Location: " .$pagina_di_login);
  }
?>
Immagino che il resto del "metacodice" si capisca.
Bye.


Ti ringrazio molto, sei stato gentilissimo e molto chiaro in questo
tuo ultimo esempio.
Ho imparato un sacco di cose. :-)
Grazie ancora.
P.


Dunque, ho fatto come dicevi ma inserendo:
<?php
if(!isset($_SESSION['utente'])){
	header("Location: ./auth_user.php");
}
?>
nella pagina da proteggere questi mi rimanda sempre alla pagina di
autenticazione indipendentemente dal fatto che mi sia autentificato o
no.
Cioè, da auth_user.php effettuo il login dal form ma poi vengo
reindirizzato di nuovo in auth_user.php...mentre se non metto quella
porzione di codice accedo regolarmente alla pagina protetta(che
ovviamente non è protetta).
Questo è il codice di auth_user.php da dove effettuo il login, ometto
solo la parte relativa al db:
if(isset($_POST['userid'])){
	$link_id=mysql_connect($dbhost, $dbusername, $dbuserpassword) or
die("Connessione al database fallita.");
	mysql_select_db($default_dbname, $link_id) or die("Selezione del
database fallito");
	$userid=$_POST['userid'];
	$userpassword=$_POST['userpassword'];
	$query="SELECT * FROM $user_tablename WHERE userid='$userid' AND
userpassword=password('$userpassword')";
	if(!$res=mysql_query($query)) echo "query fallita";
	if(mysql_num_rows($res) > 0){
		//Utente OK;
		session_start();
		$_SESSION['utente'] = mysql_fetch_array($res, MYSQL_ASSOC);
		header("Location: ./ok.php");
	}
	else echo "Login Fallito - Riprova";
}
?>
<html>
<head>
<meta http-equiv="Content-Language" content="en" />
<meta name="GENERATOR" content="PHPEclipse 1.0" />
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
<title>login</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#FF9966" vlink="#FF9966"
alink="#FFCC99">
  <form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
  <fieldset>
   <legend>Login</legend>
   <input type="text" name="userid">
   <input type="text" name="userpassword">
   <input type="submit" value="ENTRA" name="Submit">
  </fieldset>
</form>
</body>
</html>
Sinceramente ora non capisco proprio.
gp

 ?>
Una piccola nota: per il redirect utilizzare un URI completa (come da 
RCF) e dopo header mettere un exit altrimenti alcuni browser continuano 
l'esecuzione dello script.
	Francesco


Ti ringrazio per la tua puntualizzazione ma purtroppo, pur mettendo
exit dopo header il problema persiste....sinceramente non capisco dove
possa essere il problema.
p

 e poi
exit()
 session_start();
 $_SESSION['utente'] = mysql_fetch_array($res, MYSQL_ASSOC);
 session_write_close();
 header('Location: '...php);
 exit();
Ciao.
-- 
Federico


Mi fustigherei.
Era questo il problema. Che pollo.
Per il resto che hai scritto, ti ringrazio per i consigli che ora farò
miei applicandoli.
Ringrazio veramente tutti per la disponibilità ad aiutarmi ma
soprattutto a farmi capire dove sbaglio e come affrontare il problema.
Non è che avete un ottimo testo, anche teorico, su cui studiare ed
approfondire?
Qualsiasi sia il suo grado di difficoltà.
Bye
p

 approfondire?
Personalmente utilizzo solo il manuale on line:
http://www.php.net/manual
Ciao.
-- 
Federico