Login errato , oppure no

Paperino78

Utente Attivo
30 Giu 2012
409
0
16
Milano
Ho una pagina di login al mi sito, sto cercando di venire a capo delproblema in quanto nonostante inserisca username corretto ma password sbagliata, miappare l'avviso che i dati sono sbagliati ma i llogin me lo fa lo stesso. Questa è la pagina di login
PHP:
	$_SESSION['username'] 	= 	$mysqli->real_escape_string(trim($_POST['username']));
	$_SESSION['password'] 	= 	$mysqli->real_escape_string(trim($_POST['password']));

	if (($_SESSION['username'] == "") OR ($_SESSION['password'] == "")) {
		echo "Inserisci il tuo username e la password. <br />";
		echo "<meta http-equiv='Refresh' content='2; URL=login3a.php?azione=login'>";
	} else if ($_SESSION['username'] == "") {
		echo "Inserisci il tuo username. <br />";
		echo "<meta http-equiv='Refresh' content='2; URL=login3a.php?azione=login'>";
	} else {

		//Cripto la password con sha1
		$password_crypt = sha1($_SESSION['password']);

		//Eseguo l'interrogazione al DB
		//if($stmt = $mysqli->prepare("SELECT * FROM utenti WHERE username= ?, password_crypt= ? ")){
		if($result = $mysqli->query("SELECT * FROM utenti")){
		
			//Controllo i dati provenienti dall'interrogazione del DB
			if ($result->num_rows == 1) {	//Se nel db trovo utente e password proseguo
				while ($row = $result->fetch_assoc())
				{
					if(($row['username'] == $_SESSION['username']) && ($row['password_crypt'] == $password_crypt)){
						
						//Il risultato è sotto forma di array associativo quindi soltanto NOMI senza NUMERI
						echo '
							<fieldset class="login_out">
								<legend>Complimenti</legend>
							    <img class="img_login" src="images/complimenti.jpg" alt=""/>
							    <span>Ben tornato '.$_SESSION['username'].',<p> il login è stato effettuato</p> con successo2!</span>
							</fieldset>
							' ;
						echo "<meta http-equiv='Refresh' content= '3; URL=Newindex.php'>";
						} else {
							echo '
							<fieldset class="login_out">
								<legend>Errore</legend>
							    <img class="img_logout" src="images/error_1.png" alt=""/>
							    <span>Username e/o password errati. Riprova</span>
							</fieldset>' ;
							echo "<meta http-equiv='Refresh' content= '5; URL=login3a.php?azione=login'>";
						}
					}
				} else {
				echo '
					<fieldset class="login_out">
						<legend>Errore</legend>
					    	<img class="img_login" src="images/error_1.png" alt=""/>
					    <span>Username e/o password errati. Riprova1</span>
					</fieldset>' ;
				echo "<meta http-equiv='Refresh' content= '5; URL=login3a.php?azione=login'>";
				}  $result->close();
		} else {
//			return FALSE;
			echo '<div id="errore"><p><h3>Probabilmente qualcosa &egrave; andato storto, Non abbiamo nessuno registrato con questi dati. Riprova
			 ad inserire i dati, oppure <a href="form.php"> Registrati</a>, &egrave gratis!
			Grazie dallo staff Biblionet</h3></p></div>';
			echo "<meta http-equiv='Refresh' content='3; URL=Newindex.php'>";
		}
	}
} else {
	if(isset($_GET['azione']) && ($_GET['azione'] == 'logout')){
	//session_destroy();
	$_SESSION=array();
		echo '	<fieldset class="login_out">
					<legend>Arrivederci</legend>
				    <img class="img_logout" src="images/a presto.jpg" alt=""/>
				    <span>Torna presto a trovarci,<p> ci mancherai.</p></span>
				</fieldset>';
	echo "<meta http-equiv='Refresh' content='5; URL=Newindex.php'>";
	}

Il problema dove sta? Metto in sessione username e password, cripto la password interrogo il db, verifico che ci siano i dati e li confronto con quelli che ho preso dal form, se coincidono do l'ok altrimenti no. Ma al momento anche inserendo na password diversa il login me lo fa comunque. Chi mi aiuta a capire dove sbaglio?
 
Ciao,

il tuo problema è che valorizzi la sessione nel momento in cui raccogli i dati dal client:
PHP:
$_SESSION['username']     =     $mysqli->real_escape_string(trim($_POST['username'])); 
$_SESSION['password']     =     $mysqli->real_escape_string(trim($_POST['password']));
E' questo il motivo per cui l'utente si ritrova sempre autenticato. Dovresti usare delle variabili per questo compito.

Basandomi sul tuo codice, ti scrivo un esempio di come potresti agire:
PHP:
// ci sono dati in post?
if (!empty($_POST['username']) && !empty_($_POST['password'])) {

    // Raccolta dati form
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    // Preparazione query
    if ($stmt = $mysqli->prepare("SELECT username, password_crypt FROM utenti WHERE username= ? AND password_crypt = ? LIMIT 1")) {
        // Parametri da inviare con la query
        $stmt->bind_param("ss", $username, $password);
        // Variabili di output della query
        $stmt->bind_result($query_username, $query_password);
        // Richiesta effettiva
        if ($stmt->fetch()) {
            $stmt->close();

            // Dati OK! Sessione da valorizzare..
            $_SESSION['username'] = $query_username;
            $_SESSION['password'] = $query_password;

            // Utente connesso e autenticato!

        } else {
            // Dati invalidi
        }

    } else {
        // Errore interno
    }

} else {
    // username o password assenti
}
 
Ok, ho capito! Purtroppo non conoscendo molto, anzi quasi nulla di php molte cose mi sono ignote.
Correggo e ti faccio sapere.

Sapresti darmi anche un aiuto negli altri due post che ho fatto? Sempre php.
 
Questo è il mio codice:

PHP:
	if (!empty($_POST['username']) && !empty($_POST['password'])) {
		
		//Cripto la password con sha1
		$password_crypt = sha1($_POST['password']);
		
		// Preparazione query
		if ($stmt = $mysqli->prepare("SELECT username, password_crypt FROM utenti WHERE username= ? AND password_crypt = ? LIMIT 1")) {
			$stmt->execute();
			// Parametri da inviare con la query
			$stmt->bind_param("ss", $username, $password_crypt);
			// Variabili di output della query
			$stmt->bind_result($query_username, $query_password_crypt);
			// Richiesta effettiva
			if ($stmt->fetch()) {
				$stmt->close();
				// Dati OK! Sessione da valorizzare..
				$_SESSION['username'] = $query_username;
				$_SESSION['password'] = $query_password_crypt;
	
				echo '
						<fieldset class="login_out">
							<legend>Complimenti</legend>
						    <img class="img_login" src="images/complimenti.jpg" alt=""/>
						    <span>Ben tornato '.$_SESSION['username'].',<p> il login è stato effettuato</p> con successo2!</span>
						</fieldset>
						' ;
				echo "<meta http-equiv='Refresh' content= '3; URL=Newindex.php'>";
			} else {
				echo '
						<fieldset class="login_out">
							<legend>Errore</legend>
						    <img class="img_logout" src="images/error_1.png" alt=""/>
						    <span>Errore interno! Riprova</span>
						</fieldset>' ;
				echo "<meta http-equiv='Refresh' content= '5000; URL=login3a.php?azione=login'>";
			}		
		} else {
	//		return FALSE;
			echo '
					<fieldset class="login_out">
						<legend>Errore</legend>
					    <img class="img_logout" src="images/error_1.png" alt=""/>
					    <span>Abbiamo problemi nel collegarci al Database, riprova più tardi</span>
					</fieldset>' ;
			echo "<meta http-equiv='Refresh' content= '3; URL=login3a.php?azione=login'>";
		}
	} else {
		//Se clicco senza inserire i dati nel form
		echo '
				<fieldset class="login_out">
					<legend>Errore</legend>
				    <img class="img_logout" src="images/error_1.png" alt=""/>
				    <span>Username e/o password errati o non inseriti. Riprova2</span>
				</fieldset>' ;
		echo "<meta http-equiv='Refresh' content= '5; URL=login3a.php?azione=login'>";
	}

e purtroppo non riesco ad interrogare il db, ovviamente i dati ci sono.
 
Rieccomi, purtroppo con il modello che mi hai scritto non sono riuscito a fare nulla, piuttosto, utilizzando questo sistema tutto sembra funzionare
PHP:
	if($result = $mysqli->query("SELECT * FROM utenti")){
			while ($row = $result->fetch_assoc())

			{
				$_SESSION['username'] = $row['username'];
				$password_crypt = $row['password_crypt'];

			}
			echo '
						<fieldset class="login_out">
							<legend>Complimenti</legend>
						    <img class="img_login" src="images/complimenti.jpg" alt=""/>
						    <span>Ben tornato '.$_SESSION['username'].',<p> il login è stato effettuato</p> con successo2!</span>
						</fieldset>
						' ;
			echo "<meta http-equiv='Refresh' content= '30000000; URL=login3a.php?azione=login'>";
		} else {
			echo '
 				<fieldset class="login_out">
 					<legend>Errore</legend>
 				    <img class="img_logout" src="images/error_1.png" alt=""/>
 				    <span>Errore interno! Riprova</span>
 				</fieldset>' ;
			echo "<meta http-equiv='Refresh' content= '5000; URL=login3a.php?azione=login'>";
		}

spero però di venire a capo del problema con lo statment perchè voglio utilizzarlo, ma non ne vengo fuori, in quanto l'username mi da NULL. Avete idee?!
 
Rieccomi, dopo alcune prove al momento il codice completo e funzionante è questo
PHP:
	if (!empty($_POST['username']) && !empty($_POST['password'])) {

		$username  = $mysqli->real_escape_string(trim($_POST['username']));

		//Cripto la password con sha1
		$password_crypt = sha1($_POST['password']);

		if($result = $mysqli->query("SELECT * FROM utenti")){
			//Se riesco a collegarmi con il database proseguo
			while ($row = $result->fetch_assoc())

			{
				$row_username = $row['username'];
				$row_password_crypt = $row['password_crypt'];

			}
			// Controllo se i dati inseriti corrispondono a quelli nel database
			if (($row_username == $username) && ($row_password_crypt == $password_crypt)) {
				$_SESSION['username'] = $username;
				//Se i dati coincidono loggo l'utente e gli do i benvenuto
			echo '
				<fieldset class="login_out">
					<legend>Complimenti</legend>
				    <img class="img_login" src="images/complimenti.jpg" alt=""/>
				    <span>Ben tornato '.$_SESSION['username'].',<p> il login è stato effettuato</p> con successo2!</span>
				</fieldset>';
			echo "<meta http-equiv='Refresh' content= '3; URL=Newindex.php'>";
			} else {
				//Se non coincidono do questo avviso
				echo '
 				<fieldset class="login_out">
 					<legend>Errore</legend>
 				    <img class="img_logout" src="images/error_1.png" alt=""/>
 				    <span>I dati che hai inserito sono errati, controlla e riprova.</span>
 				</fieldset>' ;
				echo "<meta http-equiv='Refresh' content= '3; URL=login3a.php?azione=login'>";
			}
		} else {
			//se non riesco a collegarmi al DB do questo avviso
			echo '
 				<fieldset class="login_out">
 					<legend>Errore</legend>
 				    <img class="img_logout" src="images/error_1.png" alt=""/>
 				    <span>Errore interno! Riprova</span>
 				</fieldset>' ;
			echo "<meta http-equiv='Refresh' content= '5000; URL=login3a.php?azione=login'>";
		}
		} else {
		//Se clicco senza inserire i dati nel form do questo avviso
		echo '
				<fieldset class="login_out">
					<legend>Errore</legend>
				    <img class="img_logout" src="images/error_1.png" alt=""/>
				    <span>Username e/o password errati o non inseriti. Riprova2</span>
				</fieldset>' ;
		echo "<meta http-equiv='Refresh' content= '5; URL=login3a.php?azione=login'>";
		}
}

Grazie a flameseeker per la dritta!!
 

Discussioni simili