2010-08-19 5 views
0

Hey les gars, que je suis le dénigrement de ma tête pendant des heures maintenant, au cours de cette script de connexion. C'est celui que j'ai toujours utilisé, et je sais que cela fonctionne sur ma version de MySQL. Il ne m'enverra pas à la bonne page autorisée, il redirigera toujours vers le fichier "login_failed.php".parfaitement bon PHP/MySQL script de connexion ne fonctionne pas

Toute aide est très appréciée.

<?php 
ob_start(); 
$host="localhost"; 
$username="*****"; 
$password="*****"; 
$db_name="*****"; 
$tbl_name="*****"; 

mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB"); 

$myusername=$_POST['user']; 
$mypassword=$_POST['pass']; 

$encrypted_password=md5($mypassword); 

$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and passwd='$mypassword'"; 
$result=mysql_query($sql); 

$count=mysql_num_rows($result); 

if($count==1){ 
session_register("myusername"); 
session_register("mypassword"); 
header("location:main.php"); 
} 
else { 
header("location:login_failed.php"); 
} 

ob_end_flush(); 
?> 
+1

Avez-vous vérifié qu'une ligne existe réellement dans la base de données? –

+12

Si ça ne marche pas, ça ne peut pas être parfait. – NullUserException

+1

Et avez-vous vérifié qu'il n'y a pas * plusieurs * lignes correspondantes dans la base de données? Vous ne vérifiez que 'count == 1' pas' count> = 1'. –

Répondre

3

Ce que je vois ce n'est pas tout à fait raison sur le code:

  1. Très probablement, vous aurez pas besoin stripslashes() depuis magic quotes a été dépréciée.

  2. Vous n'avez pas besoin d'échapper à un mot de passe haché. Le résultat d'un appel md5() peut être défini sur 32 caractères hexadécimaux.

  3. Ne pas utiliser SELECT * ... lorsque vous n'avez pas besoin de tous les champs.

  4. Vous devriez probablement trim() l'entrée ($_POST['user'] et $_POST['pass']) pour se débarrasser des espaces blancs supplémentaires qui pourrait avoir été accidentellement inséré.

  5. Comme ircmaxell a souligné, vous n'utilisez pas le mot de passe sur la requête hachée. J'espère que c'était juste une erreur dans la construction de la requête.

  6. Vous devriez salez vos mots de passe. Lisez cet article: Just hashing is far from enough.

maintenant ... Avez-vous essayé faisant écho à la requête et en cours d'exécution vous-même pour voir ce qui se passe réellement? par exemple:

Retirez les Redirections et mettre un echo $sql avant d'appeler mysql_query()

+1

Un grand merci à vous tous pour avoir mis en lumière mes nombreuses erreurs et lacunes. Je n'ai pas passé beaucoup de temps avec PHP, donc je ne suis pas au courant à 100% de la façon la plus sûre de le faire ou de la meilleure façon de le faire. C'est pourquoi je viens à cet endroit, car plutôt que de simplement donner une réponse, ou signaler un problème, vous (presque) tous élaborés, ce qui est bon pour l'apprentissage. – TuxMeister

2

il pourrait y avoir deux ces utilisateurs dans la db ... également, vérifier si les valeurs que vous utilisez dans la requête sont corrects. utilisez-vous des caractères non-latin/spéciaux dans le nom d'utilisateur/mot de passe?

0

Je peux me tromper, mais avec regardant juste rapidement à votre code, vous cryptez le mot de passe, mais ne pas utiliser que dans la requête. essayez ...

//instead of ... 
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and passwd='$mypassword'"; 

//try...   
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and passwd='$encrypted_password'"; 
0

Assurez-vous que vous vérifiez d'erreur après l'appel à mysql_query comme celui-ci, par exemple:

if (!($res = mysql_query($query))) 
    die("MySQL query $query failed: ".mysql_error()) ; 

Si cela n'erreur pas pour vous, ajoutez:

avant l'appel à mysql_query() et de voir si la requête est ce que vous attendiez, et si oui, si elle fonctionnera avec succès depuis le client en ligne de commande MySQL ou un autre outil qui permet d'exécuter des requêtes contre MySQL

Questions connexes