Area Riservata PHP+MySql - Chi mi corregge il codice???

freddie24

Utente Attivo
21 Ott 2011
56
0
0
Ciao a tutti,

sto costruendo un area riservata in PHP che si interfaccia in MySql.

Il problema è che mi da sempre "Wrong Username or Password".

_______________________________________________________________

Ho un database MySql con una tabella "utenti" di 3 campi :

"id" , primary key, autoincrement, unica.
"user", varchar 32
"password", varchar 32 (md5).

user=admin e password=admin (per fare delle prove!)
_______________________________________________________________

ecco i file php :

config.php:

PHP:
<?php
$DB_host     = 'localhost';
$DB_user     = 'root';
$DB_password = '';
$DB_name     = 'mio_db';
?>


connect.php:

PHP:
<?php
$link = mysql_connect($DB_host, $DB_user, $DB_password);
if (!$link) {
	die ('Non riesco a connettermi: ' . mysql_error());
}

$db_selected = mysql_select_db($DB_name, $link);
if (!$db_selected) {
	die ("Errore nella selezione del database: " . mysql_error());
}
?>

login.php:
PHP:
<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="form1" method="post" action="checklogin.php">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong>Area Riservata</strong></td>
</tr>
<tr>
<td width="78">Username</td>
<td width="6">:</td>
<td width="294"><input name="user" type="text" id="user"></td>
</tr>
<tr>
<td>Password</td>
<td>:</td>
<td><input name="password" type="password" id="password"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Login"></td>
</tr>
</table>
</td>
</form>
</tr>
</table>

checklogin.php:
PHP:
<?php
ob_start();
include("config.php");
include ("connect.php");

// Define $user and $password 
$user=$_POST['user']; 
$password=$_POST['password'];

// To protect MySQL injection (more detail about MySQL injection)
$user = stripslashes($user);
$password = stripslashes($password);
$user = mysql_real_escape_string($user);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $user and $password, table row must be 1 row

if($count==1){
// Register $user, $password and redirect to file "login_success.php"
session_register("user");
session_register("password"); 
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}

ob_end_flush();
?>

login_success.php
PHP:
<?php 
session_start();
if(!session_is_registered("user")){
header("location:main_login.php");
}
?>

<html>
<body>
Login Successful
</body>
</html>

logout.php:
PHP:
<?php 
session_start();
session_destroy();
?>


______________________________________________________________________
Mi aiutate a risolvere???

Grazie Anticipatamente!
 
non dovresti fare l md5 della password inserita?

PHP:
$password = md5(mysql_real_escape_string($password));

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'";
 
non dovresti fare l md5 della password inserita?

PHP:
$password = md5(mysql_real_escape_string($password));

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'";


grazie! ora mi da Login Successful ma con questo errore :

Deprecated: Function session_is_registered() is deprecated in C:\wamp\www\prova11\administrator\login_success.php on line 3

che corrisponde a :


PHP:
if(!session_is_registered("user")){
 
ciao
per prima cosa dal manuale ufficiale php

Use of session_register() is deprecated

poi verifica cosa tri tramettono i post con il sempre ignorato var_dump

PHP:
<?php
ob_start();
include("config.php");
include ("connect.php");

// Define $user and $password 
$user=$_POST['user']; 
$password=$_POST['password'];
var_dump($_POST['user']);//qui verifichi cosa arriva dal form
var_dump($_POST['password']);
// To protect MySQL injection (more detail about MySQL injection)
$user = stripslashes($user);
$password = stripslashes($password);
$user = mysql_real_escape_string($user);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'";
var_dump($sql]);//qui verifichi se la query viene scritta giusta

$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $user and $password, table row must be 1 row

if($count==1){
// Register $user, $password and redirect to file "login_success.php"
//session_register("user");
//session_register("password"); 
//queste due sopra le sostituisci con
$_SESSION['user']=$user;
$_SESSION['password']=$password;
//header("location:login_success.php");//questo lo commenti altrimenti non vedi i risultati
}
else {
echo "Wrong Username or Password";
}

ob_end_flush();
?>
nel login_success.php sostituisci

PHP:
<?php 
session_start();
if(!isset($_SESSION['user'])){
header("location:main_login.php");
}
?>
<html>
<body>
Login Successful
</body>
</html>

@ ciric
non dovresti fare l md5 della password inserita?
si se l'ha registrata con md5 o meglio ancora con sha1, altrimenti no
 
Ho corretto tutto come hai mi hai consigliato,

e il risultato è questo:

http://localhost/prova11/administrator/checklogin.php

string 'admin' (length=5)

string 'admin' (length=5)

string 'SELECT * FROM utenti WHERE user='admin' and password='admin'' (length=60)

Wrong Username or Password
=============================================

forse dopo togliendo i var_dump tutto funziona bene?
 
Rimetti anche l md5 sulla password

PHP:
$password = md5(mysql_real_escape_string($password));

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'";

I var_dump si tolgono quando tutto funziona
 
Ultima modifica:
Rimetti anche l md5 sulla password

PHP:
$password = md5(mysql_real_escape_string($password));

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'";

si... già fatto!

ho sostituito anche le 2 righe da te suggerite! e tutto funziona bene! G R A Z I E...

adesso per proteggere le mie pagine dell'amministrazione... qual'è il pezzo di codice che devo inserire in ogni pagina?

e per effettuare il logout?
 
ciao
forse dopo togliendo i var_dump tutto funziona bene?
i var_dump servono per vedere quello che succede (debug) che ci siano o no non fa funziore o non funziare uno script (si tolgono o si commentano dopo che uno ha capito dove sta l'errore)

da quello che posti relativamente ai risultati dei var_dump:
la trasmissione dei $_post è ok
se la query è come tu vorresti (e mi sembra di si) probabilmente l'errore è nel db.
i nomi dei campi in tabella utenti sono uguali (comprese minuscole/maiscole) ai nomi che scrivi nella query?
i valori dei due campi (admin) sono uguali a quelli che hai nella query?
per caso (come dice ciric) non hai codificato la password con md5() o sha1() quando l'hai registrata nella tabella?
verifica con adminmysql i nomi e valori che ci siano e che siano uguali

non avevo ancora visto il tuo post successivo
 
Ultima modifica:
ciao

i var_dump servono per vedere quello che succede (debug) che ci siano o no non fa funziore o non funziare uno script (si tolgono o si commentano dopo che uno ha capito dove sta l'errore)

da quello che posti relativamente ai risultati dei var_dump:
la trasmissione dei $_post è ok
se la query è come tu vorresti (e mi sembra di si) probabilmente l'errore è nel db.
i nomi dei campi in tabella utenti sono uguali (comprese minuscole/maiscole) ai nomi che scrivi nella query?
i valori dei due campi (admin) sono uguali a quelli che hai nella query?
per caso (come dice ciric) non hai codificato la password con md5() o sha1() quando l'hai registrata nella tabella?
verifica con adminmysql i nomi e valori che ci siano e che siano uguali

non avevo ancora visto il tuo post successivo


si grazie 1000 !

la password è in md5 sia nel var_dump che ne database!

avevo postato il risultato ancor prima di inserire questa riga:
PHP:
$password = md5(mysql_real_escape_string($password));

come sicurezza qual'è meglio... md5 o sha1?

il mio codice è sicuro da eventuali attacchi mysql injection ?
 
ciao
devi mettere quello che hai messo in lugin_success.php

PHP:
<?php  
session_start(); 
if(!isset($_SESSION['user'])){//la sessione non esiste
header("location:main_login.php"); //o alla pagina che preferisci
} 
?> 

<html> 
<body> 
bla...bla....bla...
</body> 
</html>

o forse megio

PHP:
<?php  
session_start(); 
if(!isset($_SESSION['user'])){//la sessione non esiste
header("location:main_login.php"); //o alla pagina che preferisci
exit();
}else{ 
?> 

<html> 
<body> 
bla...bla....bla...
</body> 
</html>
<?php
}
?>
 
C'è un problema...

ho testato il tutto e non funziona bene!

In poche parole dalla pagina di login...

1) se immetto user o pass sbagliati... stampa "Wrong Username or Password".
2) se immetto user o pass giusti ... ritorna a login.php e non in amministrazione.php


Arrivati alla pagina protetta (amministrazione.php), non riconosce la sessione e mi rimanda a login.php
____________________________________________________________________

posto i miei files

login.php :

PHP:
<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="form1" method="post" action="checklogin.php">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong>Area Riservata</strong></td>
</tr>
<tr>
<td width="78">Username</td>
<td width="6">:</td>
<td width="294"><input name="user" type="text" id="user"></td>
</tr>
<tr>
<td>Password</td>
<td>:</td>
<td><input name="password" type="password" id="password"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Login"></td>
</tr>
</table>
</td>
</form>
</tr>
</table>


checklogin.php:

PHP:
<?php 
ob_start(); 
include("config.php"); 
include ("connect.php"); 

// Define $user and $password  
$user=$_POST['user'];  
$password=$_POST['password']; 
var_dump($_POST['user']);//qui verifichi cosa arriva dal form 
var_dump($_POST['password']); 
// To protect MySQL injection (more detail about MySQL injection) 
$user = stripslashes($user); 
$password = md5(mysql_real_escape_string($password)); 
$user = mysql_real_escape_string($user); 
$password = mysql_real_escape_string($password); 

$sql="SELECT * FROM utenti WHERE user='$user' and password='$password'"; 
var_dump($sql);//qui verifichi se la query viene scritta giusta 

$result=mysql_query($sql); 

// Mysql_num_row is counting table row 
$count=mysql_num_rows($result); 
// If result matched $user and $password, table row must be 1 row 

if($count==1){ 
// Register $user, $password and redirect to file "login_success.php" 
 
$_SESSION['user']=$user; 
$_SESSION['password']=$password; 
header("location:amministrazione.php");//questo lo commenti altrimenti non vedi i risultati 
} 
else { 
echo "Wrong Username or Password"; 

} 

ob_end_flush(); 
?>

amministrazione.php

PHP:
<?php   
session_start();  
if(!isset($_SESSION['user'])){//la sessione non esiste 
header("location:login.php"); //o alla pagina che preferisci 
exit(); 
}else{  
?>  

<html>  
<body>  
pagina amministrazione 
</body>  
</html> 
<?php 
} 
?>
 
Prova ad aggiungere session_start() anche in checklogin.php
 
ciao
strano, perchè in checklogin.php la valorizzi
PHP:
<?php
//.....
if($count==1){ 
// Register $user, $password and redirect to file "login_success.php" 
$_SESSION['user']=$user; //qui 
$_SESSION['password']=$password; 
header("location:amministrazione.php");//questo lo commenti altrimenti non vedi i risultati 
} 
else { 
echo "Wrong Username or Password"; 
} 
ob_end_flush(); 
?>
e qui dovrebbe leggertela

PHP:
<?php   
session_start();  
if(!isset($_SESSION['user'])){//la sessione non esiste 
header("location:login.php"); //o alla pagina che preferisci 
exit(); 
}else{  
?>  
<html>  
<body>  
pagina amministrazione 
</body>  
</html> 
<?php 
} 
?>
come gia detto prova con i var dump
in checklogin.php commenta header e gaurada cosa ti da il var_dump
PHP:
<?php
//.....
$_SESSION['user']=$user;
var_dump($_SESSION['user']);// se ti restituiscer ...admin la sessioneè ok
$_SESSION['password']=$password; 
//header("location:amministrazione.php");//questo lo commenti altrimenti non vedi i risultati 
} 
//....
?>
se la sessione è ok decommenta l'header i riparti mettendo in amministrazione.php
PHP:
<?php   
session_start();
var_dump($_SESSION['user']);
if(!isset($_SESSION['user'])){//la sessione non esiste 
//header("location:login.php"); //questo lo commenti altrimenti non vedi i risultati 
//....
?>
e posta cosa ti restituisce

in amministrazione prima di session_start() sei sicuro che non ci sia nemmeno uno spazio?
 
ho messo un session_start(); in checklogin.php e funziona!

ma è normale che se chiudo il browser e poi lo riapro mi richiede il login? (per il semplice fatto che non ho impostato i cookie???)

quindi a questo punto il logout non serve proprio a niente se si chiude il browser... giusto?


comunque adesso provo anche con i var_dump.
 
ho fatto così in checklogin.php

PHP:
if($count==1){ 
// Register $user, $password and redirect to file "login_success.php" 
 
var_dump($_SESSION['user']=$user); 
var_dump($_SESSION['password']=$password); 
header("location:amministrazione.php");//questo lo commenti altrimenti non vedi i risultati 
} 
else { 
echo "Wrong Username or Password"; 

}

se metto una pass errata :

string 'sfgsfg' (length=6)

string 'sdfgsg' (length=6)

string 'SELECT * FROM utenti WHERE user='sfgsfg' and password='651456c62b68e5dbe94edf36f5c7241f'' (length=88)

Wrong Username or Password

=======================================================================
PS: è normale che se metto user e pass mi dia questo output? (la pass in md5 non è vuota???)

string '' (length=0)

string '' (length=0)

string 'SELECT * FROM utenti WHERE user='' and password='d41d8cd98f00b204e9800998ecf8427e'' (length=82)

Wrong Username or Password

=======================================================================


se metto i dati esatti non compare niente e mi reindirizza alla pagina di amministrazione.
 
PS: è normale che se metto user e pass mi dia questo output? (la pass in md5 non è vuota???)

l'md5 viene eseguito anche su una stringa vuota

Direi che puoi togliere i var_dump e andare avanti
 
ciao
devi mettere quello che hai messo in lugin_success.php

PHP:
<?php  
session_start(); 
if(!isset($_SESSION['user'])){//la sessione non esiste
header("location:main_login.php"); //o alla pagina che preferisci
} 
?> 

<html> 
<body> 
bla...bla....bla...
</body> 
</html>

o forse megio

PHP:
<?php  
session_start(); 
if(!isset($_SESSION['user'])){//la sessione non esiste
header("location:main_login.php"); //o alla pagina che preferisci
exit();
}else{ 
?> 

<html> 
<body> 
bla...bla....bla...
</body> 
</html>
<?php
}
?>

tra questi 2 modi di proteggere le pagine, qual'è meglio e perchè?
 
ciao
come dice il sommo alex
PHP:
<?php
//...........
 	header("location:main_login.php");
	// se non interrompi il caricamento, l'utente potrebbe accedere comunque
	exit();
//...........
?>
poi per quanto riguarda md5 e sha1 prova questo piccolo script e vedi la differenza
PHP:
<?php
$password="pinco";
echo "con md5 ".md5($password."<br>";
echo "con sha1 ".sha1($password."<br>";
?>
 
ciao
come dice il sommo alex
PHP:
<?php
//...........
 	header("location:main_login.php");
	// se non interrompi il caricamento, l'utente potrebbe accedere comunque
	exit();
//...........
?>
poi per quanto riguarda md5 e sha1 prova questo piccolo script e vedi la differenza
PHP:
<?php
$password="pinco";
echo "con md5 ".md5($password."<br>";
echo "con sha1 ".sha1($password."<br>";
?>

Grazie per le risposta...

ho notato che la differenza per la password "pinco" tra md5 e sha1 è di 9 caratteri, quindi deduco che sha1 sia un po' più robusta come password.
 

Discussioni simili