login che non logga...

Stato
Discussione chiusa ad ulteriori risposte.

MasteR_

Utente Silver
11 Agosto 2008
26
4
0
63
allora, in questi giorni sto cercando di programmare qualcosa al lato db e sql...
sto creando un login, il problema è che non logga, aiuto please..
codice login.php:
PHP:
<html><head>
<title>Login.php</title>
</head>
<body>
<!-- inzio form -->
<form name="login" action="login.php" method="post">
<b>Username</b> <input name="name" type="text">
<b>Password</b> <input name="pass" type="password">
<input type="submit" name="invia">
<!-- fine form -->
<?php
//includo la pagina con la connessione al db
include("config.php");
include("menu.html");
//nome tabella per login

$name=htmlspecialchars($_REQUEST['name']);
$pass=htmlspecialchars($_REQUEST['pass']);

$connection = mysql_connect($host, $user, $password) or die ("impossibile connettersi al db");
mysql_select_db("$database") or die("error");
$sql = "SELECT * FROM 'user' WHERE username='$name' and password='$pass'";
$result=mysql_query($sql);
$count=mysql_num_rows($result);
if($count >0) {
session_register("name");
session_register("pass");
header("location:login_success.php");

} else{

}
mysql_close($db);
?>
</body>
</html>
login_success.php
PHP:
<?php
session_start();
if(!session_is_registered(username)) {}
?>
 
Mah... a cosa ti serve la pagina login_success??
PHP:
<?php
//includo la pagina con la connessione al db
include("config.php");
include("menu.html");
//nome tabella per login
session_start();
if(!@$_POST['name'] && !@$_POST['pass']) {
?>
<html><head>
<title>Login.php</title>
</head>
<body>
<!-- inzio form -->
<form name="login" action="login.php" method="post">
<b>Username</b> <input name="name" type="text">
<b>Password</b> <input name="pass" type="password">
<input type="submit" name="invia">
<!-- fine form -->
</body>
</html>
<?php
}else {
$name=htmlspecialchars($_REQUEST['name']);
$pass=htmlspecialchars($_REQUEST['pass']);

$connection = mysql_connect($host, $user, $password) or die ("impossibile connettersi al db");
mysql_select_db("$database") or die("error");
$sql = "SELECT * FROM user WHERE username='$name' and password='$pass'";
$result=mysql_query($sql);
$count=mysql_num_rows($result);
if($count > 0) {
	
	$_SESSION['name']=$name;
	$_SESSION['pass']=$pass;
	echo "<p>Login corretto!";

} else{
	echo "<p>Login errato!";	
}
mysql_close($db);
}
?>
Per controllare se si è loggati basta controllare la variabile $_SESSION['name'] e verificare che contenga un valore (come ho fatto nel logout).
Per il logout puoi usare una cosa del genere
PHP:
<?php
session_start();
if(@$_SESSION['name']) {
	session_unset();
	session_destroy();
}
?>
 
Cioè? Cosa vorresti sapere?
Praticamente il codice l'ho modificato in modo tale da visualizzare il form del login quando non sono passati entrambi i parametri, se sono passati sul form vengono presi e viene fatta una query, se la query da un risultato positivo vengono settate delle variabili di sessione e viene dato un messaggio.
Dicevo, per verificare poi nelle pagine che l'utente sia loggato, devi controllare le variabili di sessione
potrai avere una pagine admin per esempio o una pagina visibile sono agli utenti registrati quindi puoi fare una cosa del genere
PHP:
<?php
//pagina visibile solo agli utenti registrati.
if(@$_SESSION['name']) {
    //ok
}else echo "Non sei loggato, fai il login e riprova";
?>
 
quindi
PHP:
<?php
//pagina visibile solo agli utenti registrati.
if(@$_SESSION['name']) {
    //ok
}else echo "Non sei loggato, fai il login e riprova";
?>
lo inserisco nel login.php?
 
Ti illustro un metodo più sicuro per evitare sql injection....
PHP:
// metti tutti gli include etc
session_start();
if(!$_POST) {
header ('Location: login.html'); // se non si sono inviati i dati di login si viene mandati alla pagina login.html
exit; // e si esce
}else{ // altrimenti
$query = 'SELECT username, password FROM miatabella WHERE username = "'.$_POST['username'].'" AND password = "'.md5($_POST['password']).'"'; // preparo la query
$result = mysql_query($query); // eseguo la query
// Ora invece di usare Mysql  num rows useremo mysql fetch array
$row = mysql_fetch_array($result);
if($row['username'] == $_POST['username'] AND $row['password'] == md5($_POST['password'])) {
$_SESSION['site_logged'] = 'yes'; // imposto la sessione
echo 'Ti sei loggato con successo, tra poco verrai reindirizzato alla pagina privata...';
echo '<meta http-equiv="refresh" content="5; url=PaginaPrivata.php">'; // reindirizzo l'utente a PaginaPrivata.php dopo 5 secondi
}else{
echo 'I dati  che hai inserito non sono corretti. Verrai reindirizzato alla pagina di login nuovamente tra 5 secondi';
echo '<meta http-equiv="refresh" content="5; url=login.html">';
}

In PaginaPrivata.php metti:
PHP:
session_start();
if($_SESSION['site_logged']=='yes') {
echo 'Benvenuto nell\'area riservata.';
}else{
echo '<meta http-equiv="refresh" content="0; url=login.html">'; // Reindirizzo l'utente alla pagina di login se non è loggato
Prova, ciao
 
MasteR_ ha detto:
quindi
PHP:
<?php
//pagina visibile solo agli utenti registrati.
if(@$_SESSION['name']) {
    //ok
}else echo "Non sei loggato, fai il login e riprova";
?>
lo inserisco nel login.php?

No! Lo metti nelle pagine che devono vedere solo gli utenti registrati, il login è la prima pagina che ho postato sul primo remply.

@Robertof: veramente quel codice è vulnerabile a sql injection, per evitarle basta usare la funzione mysql_real_escape_string prima di passare il parametro nella query.
esempio mysql_real_escape_string($_POST['user']).
Comunque mi sono limitato a correggere soltanto il codice dell'utente, non so nemmeno se nel database ha l'hash md5 delle password o le password in chiaro quindi non puoi fare un codice del genere se non sai cosa c'è nel database.
 
@ stoner: Sul serio, cosa lo rende vulnerabiel e cosa fa mysql real escape string? Mi hai colto impreparato xD Comunque poi se lo corregge come vuole xD
 
PHP:
$query = 'SELECT username, password FROM miatabella WHERE username = "'.$_POST['username'].'" AND password = "'.md5($_POST['password']).'"';
Questa riga. Non viene fatto nessun controllo sul parametro username, ed è semplice fare un sql injection.
Comunque mysql_real_escape_string non fa altro che mettere gli escape nei caratteri speciali, quindi ad esempio ' diventa \'
 
Stato
Discussione chiusa ad ulteriori risposte.