Form login non funziona

di il
16 risposte

Form login non funziona

Ciao a tutti ragazzi...sto iniziando a studiare PHP per un progetto che voglio realizzare. Sto partendo proprio dalle basi, quindi creazione di un form di registrazione, salvataggio dei dati in un DB, e poi successivo login.
Ho seguito un tutorial su youtube(se serve poi posto il link) e fino al modulo di registrazione tutto ok. I dati vengono inseriti correttamente nel db e tutto funziona. Il problema arriva quando bisogna effettuare il login. Sembra infatti che le stringhe "email" e "password" non vengano proprio lette per poter essere confrontate con quelle nel DB. Infatti attualmente visualizzo l'errore "login=empty"(vedrete tra poco il codice), ma se commento tutto il controllo dei campi vuoti, allora l errore diventa login=erroremail..insomma, sempre il primo errore nell'elenco, come se appunto non leggesse proprio i campi. Provo a mettere qui il codice delle classi che servono, sperando che potete darmi una mano.

Classe signup(funziona tutto correttamente):
<?php

if (isset($_POST['submit'])){   

	include_once 'db.php';
	$nome = mysqli_real_escape_string($conn, $_POST['nome']);
	$cognome = mysqli_real_escape_string($conn, $_POST['cognome']);
	$email = mysqli_real_escape_string($conn, $_POST['email']);
	$pass = mysqli_real_escape_string($conn, $_POST['pass']);

	//Error handlers
	//Check for empty fields
	if (empty($nome) || empty($cognome) || empty($email) || empty($pass)){
		header("Location: ../signup.php?signup=empty");
		exit();
	
	} else {
		//Check if input characters are valid
		if(!preg_match("/^[a-zA-Z]*$/", $nome) || !preg_match("/^[a-zA-Z]*$/", $cognome)) {
			header("Location: ../signup.php?signup=invalidCharacter");
			exit();
		} else {
			//Check if email is valid
			if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
			header("Location: ../signup.php?signup=invalidEmail");
			exit();

			} else {
				$sql = "SELECT * FROM users where email='$email'";
				$result = mysqli_query($conn, $sql);
				$resultCheck = mysqli_num_rows($result);

				if($resultCheck > 0){
					header("Location: ../signup.php?signup=emailtaken");
					exit();

				} else {
					//Hashing the password
					$hashedPass = password_hash($pass, PASSWORD_DEFAULT);
					//Insert the user into the database
					$sql = "INSERT INTO users (nome, cognome, email, pass) VALUES ('$nome', '$cognome', '$email', '$hashedPass');";
					mysqli_query($conn, $sql);
					header("Location: ../signup.php?signup=success");
					exit();
				}
			}
		}

	}

} else {
	header("Location: ../signup.php");
	exit();

}

Classe database:

<?php 

$dbServername="localhost";
$dbUsername="root";
$dbPassword="";
$dbName="loginsys";

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
Classe login(da sistemare):
 <?php

session_start();

if (isset($_POST['submit'])){

	include 'db.php';

	$email = mysqli_escape_string($conn, $_POST['email']);
	$pass = mysqli_escape_string($conn, $_POST['pass']);

	//Check if inputs are empty

	if(empty($email) || empty($pass)){
		header("Location: ../index.php?login=empty");
		exit();

	} else{
		$sql = "SELECT * FROM users WHERE email='$email' AND pass = 'pass'";
		$result = mysqli_query($conn, $sql);
		$resultCheck = mysqli_num_rows($result);
		if($resultCheck < 1){
			header("Location: ../index.php?login=erroremail");
			exit();
		} else {
			if($row = mysqli_fetch_assoc($result)){
				//De-hashing the password
				$hashedPassCheck = password_verify($pass, $row['pass']);
				if($hashedPassCheck == false){
					header("Location: ../index.php?login=errorhash");
			        exit();

			    }elseif ($hashedPassCheck == true){
					//Log in the user here
					$_SESSION['u_id'] = $row['id_utente'];
					$_SESSION['u_nome'] = $row['nome'];
					$_SESSION['u_cognome'] = $row['cognome'];
					$_SESSION['u_email'] = $row['email'];
					header("Location: ../index.php?login=success");
			        exit();
					
					}

			}
		}

	}
} else {
	header("Location: ../index.php?login=error");
	exit();
}

 
non capisco proprio, visto che ho seguito alla perfezione il video ed inoltre le stringhe che inserisco sono uguali a quelle inserite nel campo registrazione...
Grazie in anticipo a chi mi aiuterà!

16 Risposte

  • Re: Form login non funziona

    Ahem... direi che è tutto da rifare.
    Usa metodologie vecchie e insicure, più scelte davvero rischiose (sotto il profilo della sicurezza).
    Se vuoi imparare un metodo "qualsiasi" allora puoi anche sistemarlo, altrimenti è da rifare da zero.
  • Re: Form login non funziona

    +m2+ ha scritto:


    Ahem... direi che è tutto da rifare.
    Usa metodologie vecchie e insicure, più scelte davvero rischiose (sotto il profilo della sicurezza).
    Se vuoi imparare un metodo "qualsiasi" allora puoi anche sistemarlo, altrimenti è da rifare da zero.
    Grazie per la risposta. Alla fine ho risolto, avevo sbagliato a chiamare una variabile nell' header, e infatti non mi prendeva la variabile email nel campo appunto dove lo si inserisce.
    Ma come mai non va bene quindi? La cosa del real_escape_string non serve a rendere appunto il tutto più sicuro e immune ad attacchi sql injection?
    Comunque se conosci una guida aggiornata e fatta bene che posso seguire, hai voglia di linkarmela?
  • Re: Form login non funziona

    Ce ne sono tante, inizio a segnalarti che mysqli è ormai in disuso (a favore di PDO e statement preparati).
    analogamente real_escape_string è "roba" jurassica.
    non ci sono test di lunghezza sui parametri.
    mancano verifiche banali, ma sempre utili, di sostituzione ' e ; (sì lo so si possono escapare in 1000 modi, ma d'altronde non costa nulla farlo)
    questa
    SELECT * FROM users WHERE email='$email' AND pass = 'pass'";
    è pessima sotto ogni profilo.
    1) niente condizioni "and"
    2) niente select *
    3) manca una limit 1 da aggiungere sempre, ex post
    4) come detto mancano gli statement

    password_hash la lascerei stare
    mancano verifiche su cognome nome e così via
    per la insert into vale il discorso precedente
    nessuna redirezione con dati "strani" per mancata connessione va fatta

    filter_var e simili è sempre roba "jurassica" (deprecata e insicura)
    non c'è la verifica dell'esistenza della sessione (inizialmente)

    ... insomma... una guida diciamo di qualche anno fa
  • Re: Form login non funziona

    +m2+ ha scritto:


    Ce ne sono tante, inizio a segnalarti che mysqli è ormai in disuso (a favore di PDO e statement preparati).
    analogamente real_escape_string è "roba" jurassica.
    non ci sono test di lunghezza sui parametri.
    mancano verifiche banali, ma sempre utili, di sostituzione ' e ; (sì lo so si possono escapare in 1000 modi, ma d'altronde non costa nulla farlo)
    questa
    SELECT * FROM users WHERE email='$email' AND pass = 'pass'";
    è pessima sotto ogni profilo.
    1) niente condizioni "and"
    2) niente select *
    3) manca una limit 1 da aggiungere sempre, ex post
    4) come detto mancano gli statement

    password_hash la lascerei stare
    mancano verifiche su cognome nome e così via
    per la insert into vale il discorso precedente
    nessuna redirezione con dati "strani" per mancata connessione va fatta

    filter_var e simili è sempre roba "jurassica" (deprecata e insicura)
    non c'è la verifica dell'esistenza della sessione (inizialmente)

    ... insomma... una guida diciamo di qualche anno fa
    Ti ringrazio davvero tanto per l'ottima spiegazione.
    Forse ora capisco perchè sublime quando scrivevo mysqli non me lo dava come suggerimento..ora per caso si usa mysql?
    1) Non ho capito solo perchè AND non va bene? Cosa uso per verificare che due condizioni si verifichino?
    2) cosa uso al posto di *? non devo leggere tutta la colonna dove sono salvate le email?
    3) non ho capito dove ma approfondirò
    4) mi pare che quel ragazzo che ha fatto il tutorial, li trattava più avanti infatti.

    Al posto di password_hash cosa useresti? Non va criptata nel database?
    La verifica dell'esistenza della sessione forse l ho fatta dopo(intendi verificare se l'utente è loggato o meno?) Mi ero fermato li perchè appunto mi dava errore ma ora ho risolto.
    Ti volevo chiedere ancora un favore. Visto che cercando su internet la maggior parte delle guide erano molto simili a quella che ho seguito(quindi obsolete), questa potrebbe andare? http://thisinterestsme.com/php-user-registration-form
    Inoltre vorrei comprare un libro di php e mysql..per evitare sempre di buttare soldi in roba vecchia, tu ne hai qualcuno da consigliarmene?
  • Re: Form login non funziona

    Il link che hai messo è migliore, ma ancora ci sono vere e proprie bestialità, tipo questa
    We are using a respected password hashing algorithm called BCRYPT. Other login tutorials make the mistake of promoting hashing algorithms such as md5 and sha1. The problem with md5 and sha1 is that they are “too fast”, which basically means that password crackers can “break them” at a much quicker rate.
    poi usa una libreria per le password pressochè inutile, query un po' troppo ottimistiche, nessun controllo di lunghezza e così via.
    diciamo livello hobby-dilettante
  • Re: Form login non funziona

    +m2+ ha scritto:


    Il link che hai messo è migliore, ma ancora ci sono vere e proprie bestialità, tipo questa
    We are using a respected password hashing algorithm called BCRYPT. Other login tutorials make the mistake of promoting hashing algorithms such as md5 and sha1. The problem with md5 and sha1 is that they are “too fast”, which basically means that password crackers can “break them” at a much quicker rate.
    poi usa una libreria per le password pressochè inutile, query un po' troppo ottimistiche, nessun controllo di lunghezza e così via.
    diciamo livello hobby-dilettante
    Quindi come metodo per criptare le password cosa consigli? Perché sarebbe sbagliato quello che ha scritto lui sull' md5 e lo sha1?
    Comunque io devo realizzare un sito(per me stesso) dove gli utenti per poter compiere alcune azioni si devono registrare..per cui ho bisogno che tutto il sistema sia valido. Non posso fare robe veloci/scadenti. Mi puoi consigliare un libro/guida online seria e aggiornata che posso studiare? Perché io non conoscendo la differenza tra roba vecchia/nuova, non so come orientarmi.
  • Re: Form login non funziona

    È inutile perchè il tempo (o meglio latenza) di una connessione internet è enormemente superiore alle frazioni di millisecondo di differenza tra le varie funzioni hash.
    un approccio del genere è inutile per un servizio web.
    avrebbe invece senso - ma in realtà si preferisce reiterare un migliaio di volte più funzioni hash diverse - per l'autenticazione locale.

    sul resto: se la richiesta è hobbystica va bene qualsiasi cosa, dubito dovrai affrontare chissà quale tentativo di accesso abusivo
  • Re: Form login non funziona

    +m2+ ha scritto:


    è inutile perchè il tempo (o meglio latenza) di una connessione internet è enormemente superiore alle frazioni di millisecondo di differenza tra le varie funzioni hash.
    un approccio del genere è inutile per un servizio web.
    avrebbe invece senso - ma in realtà si preferisce reiterare un migliaio di volte più funzioni hash diverse - per l'autenticazione locale.

    sul resto: se la richiesta è hobbystica va bene qualsiasi cosa, dubito dovrai affrontare chissà quale tentativo di accesso abusivo
    Quali sono i rischi che corro nel caso faccio il login in quel modo? Il mio sito dovrà offrire un servizio all' utenti..potrebbe non avere successo, però se invece funziona , ho bisogno che sia sicuro (è anche vero che difficilmente gli utenti cercheranno di entrare nel db). È comunque ancora un progetto in via di sviluppo..in ogni caso siccome volevo comprare un libro, non conosci nulla da consigliare?
    Scusa se continuo con le domande , ma approfitto della tua esperienza
  • Re: Form login non funziona

    xXNicolaXx ha scritto:


    Quali sono i rischi che corro nel caso faccio il login in quel modo?
    modesti
    Il mio sito dovrà offrire un servizio all' utenti..potrebbe non avere successo, però se invece funziona , ho bisogno che sia sicuro (è anche vero che difficilmente gli utenti cercheranno di entrare nel db). È comunque ancora un progetto in via di sviluppo..in ogni caso siccome volevo comprare un libro, non conosci nulla da consigliare?
    Scusa se continuo con le domande , ma approfitto della tua esperienza
    purtroppo no (riguardo ai libri), è un pezzo che non mi servono (se non per qualche argomento davvero esoterico).
  • Re: Form login non funziona

    +m2+ ha scritto:


    xXNicolaXx ha scritto:


    Quali sono i rischi che corro nel caso faccio il login in quel modo?
    modesti
    Il mio sito dovrà offrire un servizio all' utenti..potrebbe non avere successo, però se invece funziona , ho bisogno che sia sicuro (è anche vero che difficilmente gli utenti cercheranno di entrare nel db). È comunque ancora un progetto in via di sviluppo..in ogni caso siccome volevo comprare un libro, non conosci nulla da consigliare?
    Scusa se continuo con le domande , ma approfitto della tua esperienza
    purtroppo no (riguardo ai libri), è un pezzo che non mi servono (se non per qualche argomento davvero esoterico).
    Ah peccato..e guide online? Io ne sto cercando, ma come detto prima non so se sono sicure e aggiornate..non vorrei perdere tempo di nuovo con roba vecchia
  • Re: Form login non funziona

    +m2+ ha scritto:


    Il link che hai messo è migliore, ma ancora ci sono vere e proprie bestialità, tipo questa
    We are using a respected password hashing algorithm called BCRYPT. Other login tutorials make the mistake of promoting hashing algorithms such as md5 and sha1. The problem with md5 and sha1 is that they are “too fast”, which basically means that password crackers can “break them” at a much quicker rate.
    poi usa una libreria per le password pressochè inutile, query un po' troppo ottimistiche, nessun controllo di lunghezza e così via.
    diciamo livello hobby-dilettante
    Ma ci credevi davvero a quello che avevi scritto due anni fa? Bestialità una best practice tutt'ora usata per memorizzare le password utenti...

    +m2+ ha scritto:


    è inutile perchè il tempo (o meglio latenza) di una connessione internet è enormemente superiore alle frazioni di millisecondo di differenza tra le varie funzioni hash.
    un approccio del genere è inutile per un servizio web.
    avrebbe invece senso - ma in realtà si preferisce reiterare un migliaio di volte più funzioni hash diverse - per l'autenticazione locale.

    sul resto: se la richiesta è hobbystica va bene qualsiasi cosa, dubito dovrai affrontare chissà quale tentativo di accesso abusivo
    Fai confusione, latenza di Internet e velocità delle funzioni di hash non sono correlate tra loro.
  • Re: Form login non funziona

    flaviors200 ha scritto:


    +m2+ ha scritto:


    Il link che hai messo è migliore, ma ancora ci sono vere e proprie bestialità, tipo questa
    We are using a respected password hashing algorithm called BCRYPT. Other login tutorials make the mistake of promoting hashing algorithms such as md5 and sha1. The problem with md5 and sha1 is that they are “too fast”, which basically means that password crackers can “break them” at a much quicker rate.
    poi usa una libreria per le password pressochè inutile, query un po' troppo ottimistiche, nessun controllo di lunghezza e così via.
    diciamo livello hobby-dilettante
    Ma ci credevi davvero a quello che avevi scritto due anni fa? Bestialità una best practice tutt'ora usata per memorizzare le password utenti...
    "best practice" per dilettanti, diciamo che quello è livello dilettante che ho passato da un 28 anni almeno.

    +m2+ ha scritto:


    è inutile perchè il tempo (o meglio latenza) di una connessione internet è enormemente superiore alle frazioni di millisecondo di differenza tra le varie funzioni hash.
    un approccio del genere è inutile per un servizio web.
    avrebbe invece senso - ma in realtà si preferisce reiterare un migliaio di volte più funzioni hash diverse - per l'autenticazione locale.

    sul resto: se la richiesta è hobbystica va bene qualsiasi cosa, dubito dovrai affrontare chissà quale tentativo di accesso abusivo
    Fai confusione, latenza di Internet e velocità delle funzioni di hash non sono correlate tra loro.
    Non faccio la minima confusione, non hai compreso bene il discorso.
    Approfondisci un pochino.
  • Re: Form login non funziona

    +m2+ ha scritto:


    "best practice" per dilettanti, diciamo che quello è livello dilettante che ho passato da un 28 anni almeno.
    Il contesto è un form di registrazione e login di un applicazione web. L'hash delle password lo salviamo con una funzione di hash robusta e sicura: md5 e sha1 sono la preistoria, bcrypt e Argon2 sono le migliori al momento, anche in caso di furto del database contenente gli hash.

    Cosa non ti quadra in tutto questo?

    Tra l'altro mi ha colpito il fatto che hai etichettato come "bestialità" questa frase che esprime un concetto oggettivo
    We are using a respected password hashing algorithm called BCRYPT. Other login tutorials make the mistake of promoting hashing algorithms such as md5 and sha1. The problem with md5 and sha1 is that they are “too fast”, which basically means that password crackers can “break them” at a much quicker rate.
    Sentiamo, quale sarebbe questo tuo approccio non-dilettantesco?
  • Re: Form login non funziona

    The problem with md5 and sha1 is that they are “too fast” è una cazzata, neanche una bestialità.
    Per il resto lascio ognuno con le proprie opinioni, ho da tempo imparato che ci sono tanti esperti di crittografia quanti ct della nazionale
Devi accedere o registrarti per scrivere nel forum
16 risposte