hvorfor kan jeg ikke logge ind?

Tags:    php mysql sha512 login-system

Mit problem ligger i at når jeg prøver at logge ind, så springer mit script direkte til else delen af mit loop.

Jeg har lagt nogle printf statements ind for at hælpe mig med debugging.

Bla. har jeg fundet ud af at $password efter hashing med hash(sha512) stemmer over ens med den hash værdi som er gemt i databasen.



Fold kodeboks ind/udPHP kode 




10 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Jeg har løst problemet og det var rigtig dumt.

Boys, koden virker fint - dog er det noget af det mest usikre længe set hehehe

fejlen ligger i mysql hmm... min row som indeholder password er VARCHAR 128 og ikke 512! som den skal være hvis jeg bruger shar512 tsk tsk tsk!

Klart at det ikke virker så, jeg får kun fetched halvdelen af passwordet.


btw. stefan s. jeg addede også disse linier og ja, ingen fejl.

dog fandt jeg ud af at jeg havde glem $conn i
mysql_select_db($dbname, $conn) or die ("Failed to connect.");

men nu virker det sku


så skal der rydes op! :$



Indlæg senest redigeret d. 28.07.2011 20:34 af Bruger #16715
prøv
Fold kodeboks ind/udPHP kode 


og se hvad den skriver ud.



Jeg kan ikke finde nogle fejl i din kode.

Har du prøvet at udskrive din $sql og smide den ind i phpmyadmin eller lign.?

Måske prøv at ændre din sql til:

$sql = "SELECT * FROM $table WHERE username = '$username'";
eller
$sql = "SELECT * FROM $table WHERE password = '$password'";

For at afprøve hvilket felt der ikke er noget match på. Så har du da udelukket halvdelen :)




som sql warning siger, der er en bubu på linie 35, return NULL!

Linien som skabte fejlen var min counter, som egenligt var en sikkerheds foranstaltning for at undgå at der bliver skrevet flere bruger ud på én gang.


Du har ikke en fejl på linie 35!

Den kan ikke tælle resultaterne i $result, hvilket skyldes din query er fejlet. Hvis der ikke blev fundet nogen, ville mysql_num_rows returnere 0.

Det er altså her den går galt:
$sql = "SELECT * FROM $table WHERE username = '$username' AND password = '$password'";

Og vi ved nu, det er username der driller.

Prøv at tilføje 2 linier nedenunder:

echo $sql."<br>";
echo mysql_err();

Så kan vi se hvordan den færdige query ser ud og hvilken fejlmeddelse mysql returnere.



$sqlint(0)

som så indikere at dataen ikke er at finde i databasen.


min database ser sådan ud:

Fold kodeboks ind/udSQL kode 






Indlæg senest redigeret d. 28.07.2011 09:18 af Bruger #16715
da jeg ændrede koden til ovenstående modtog jeg følgende fejlmeddeleser.

$sql Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/ideabank/checklogin.php on line 35 Call Stack: 0.0002 657184 1. {main}() /var/www/ideabank/checklogin.php:0 0.0006 660584 2. mysql_num_rows() /var/www/ideabank/checklogin.php:35 NULL


Og line 35 er min if($count==1)


"Har du prøvet at udskrive din $sql og smide den ind i phpmyadmin eller lign.?"

-Det er jeg ikke sikker på hvad du mener med....

UPDATE:


Har du prøvet at udskrive din $sql og smide den ind i phpmyadmin eller lign.?


Sidder lige nu på mysql's hjemmeside og researcher temporary tables, er det dét du mente?


UPDATE:




Jeg har testet denne query mod databasen
Fold kodeboks ind/udSQL kode 


resultatet er, Showing rows 0 - 5 (6 total, Query took 0.0004 sec)

Ok, så jeg har gjort min query endnu mere simpel ved at fjerne min variabel som holder table navnet og skrevet det direkte i min query.

$sql = "SELECT * FROM members WHERE password = '$password'";

resultat:

$sqlint(2)


det er rigtigt nok idet der er to kontoer med det samme kodeord.
Så ændrede jeg min query til:

$sql = "SELECT * FROM members WHERE username = '$username'";

Det ville give mening da username skal være unikt.

resultat:

$sql Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/ideabank/checklogin.php on line 35 Call Stack: 0.0002 653256 1. {main}() /var/www/ideabank/checklogin.php:0 0.0007 656528 2. mysql_num_rows() /var/www/ideabank/checklogin.php:35 NULL




UPDATE:

Jeg vil gerne sende KARMA ud til de to herre som har hjulpet mig videre med mit projekt. Selvom jeg ikke er kommet til en løsning endnu. Jeg har fået lidt mere indsigt i mit problem...

som sql warning siger, der er en bubu på linie 35, return NULL!

Linien som skabte fejlen var min counter, som egenligt var en sikkerheds foranstaltning for at undgå at der bliver skrevet flere bruger ud på én gang.

min originale ide var:

if result match $username & $password then row must be == to 1


Men når den spøger om et resultat som er ==1 eller brugt på en anden måde != eller >1

Så kan SQL ikke hitte ud af hvad der sker, f.eks da jeg brugte query

$sql = "SELECT * FROM members WHERE password = '$password'";

Så gav den en forkert værdi.

Nu har jeg prøvet at skrotte counteren og i stedet for, validere querien på en anden måde

Fold kodeboks ind/udSQL kode 


Som så kaster den samme fejl efter mig






Indlæg senest redigeret d. 28.07.2011 18:20 af Bruger #16715
En sha512 hash burde da blive 128 bogstaver? Men godt du fik det til at virke.



ja, fordi ét utf-8 tegn svare til fire bit. 512bit/4bit = 128bit.

Jeg ved heller ikke hvorfor det skulle gøre en forskel men det gjorde det hehehe.


er der nogen af jer der har flere forslag til hvordan jeg kan sanitize mine user inputs?

har lige tilføjet trim og real_escape_string til username.






Validering er altid det bedste udgangspunkt. Oprydning er noget man gør som sidste udvej. :)

Og jeg ville nok overveje at droppe escaping og begynde at kigge på MySQLi, og parameteriseret SQL. Især fordi MySQL driveren udfaces.



nogle gode forslag til validering?

Og har du mulighed for at prøve at omskrive min sql streng til mysqli?
-Det ville være top nudge



t