2016-03-01 2 views
1

J'ai créé un système qui permet à un administrateur d'enregistrer un autre administrateur avec une adresse e-mail et un mot de passe pour se connecter à une zone protégée. Un administrateur est enregistré par ce formulaire:Pourquoi mon système de connexion ne fonctionne-t-il pas?

<form action="adduser.php" method="POST"> 
      <label for="emailaddress">Email Address: </label><input type="text" name="emailaddress" /> 
      <label for="password">Password: </label><input type="password" name="password" /> 
      <label for="name">Name: </label><input type="text" name="name"/> 
      <input type="submit" value="Submit" name="submit"/> 
</form> 

Le adduser.php ressemble à ceci:

<?php 
    require'databaselogin.php'; 
    if(isset($_POST['emailaddress'],$_POST['password'],$_POST['name'])){ 
     $result= $pdo->prepare('INSERT INTO users (emailaddress, password, name) 
          VALUES(:emailaddress, :password, :name)'); 
     $hash = password_hash($_POST['password'], PASSWORD_DEFAULT); 
     unset($_POST['submit']); 
     $_POST['password'] = $hash; 
     $result->execute($_POST); 
     header("Location:admin.php"); 
    } 
?> 

Jusqu'à ici semble fonctionner la table appelée utilisateurs obtient ensuite rempli avec des données. Je suppose que potentiellement il pourrait utiliser $ hash incorrectement que le mot de passe stocké dans la table n'est pas ce que l'utilisateur a entré dans le champ mot de passe?

Lorsque l'utilisateur tente de se connecter en utilisant ce formulaire:

<form action="login.php" method="POST" > 
       <label for="emailaddress">Email Address:</label><input type="text" name="emailaddress"/> 
       <label for="password">Password:</label><input type="password" name="password"/> 
       <input type="submit" value="Go" name="submit"/> 
      </form> 

Liens vers ce php:

<?php 
    session_start(); 

     require'databaselogin.php'; 
      $stmt = $pdo->prepare('SELECT * FROM users WHERE emailaddress = :emailaddress'); 
      if(isset($_POST['submit'])){ 
      $criteria = [ 
      'emailaddress' => $_POST['emailaddress'], 
      ]; 
      $stmt->execute($criteria); 

      $user = $stmt->fetch(); 
      var_dump($user); 
      if (password_verify($_POST['password'], $user['password'])) { 
       $_SESSION['loggedin'] = $user['id']; 
       header("Location:admin.php"); 
      } 
      else { 
       header("Location:index.php"); 
      } 
      } 
?> 

Avec l'e-mail et mot de passe entré dans l'enregistrement à partir du site juste rechargements sur index.php plutôt que de les emmener à admin.php. Je n'arrive vraiment pas à comprendre le problème ici car le code semble être trop clair. Je suppose que c'est un problème avec ce que $ hash enregistre réellement dans le champ mot de passe.

Si quelqu'un peut aider avec ceci ce serait vraiment apprécié!

+0

Qu'en est-ce, inscrivez-vous un utilisateur avec un mot de passe simple comme 1234 et vérifier votre table pour le hachage stocké. Ensuite, faites écho à un hashed 1234 en utilisant la même méthode, regardez si les chaînes correspondent. S'ils le font, le problème n'a rien à voir avec le hachage. – Abdel

+4

et, quelle est la longueur de la colonne de mot de passe? Si c'est trop court, il échoue pour vous * en silence *. –

+1

Quel est le résultat de 'var_dump ($ user)'? –

Répondre

3

Puisque vous ne répondez pas aux commentaires, je soumets ce qui suit. Je suspecte que la longueur de votre colonne de mot de passe est trop courte.

Si c'est le cas, vous devez le régler à 60+. ALTER votre colonne, effacez vos lignes de mot de passe contenant des hachages, créez un nouveau hachage et réessayez.

Le manuel sur ce point:

PASSWORD_DEFAULT - Utilisez l'algorithme bcrypt (par défaut à partir de PHP 5.5.0). Notez que cette constante est conçue pour changer au fil du temps à mesure que de nouveaux algorithmes plus puissants sont ajoutés à PHP. Pour cette raison, la longueur du résultat de l'utilisation de cet identifiant peut changer avec le temps. Par conséquent, il est recommandé de stocker le résultat dans une colonne de base de données pouvant s'étendre au-delà de 60 caractères (255 caractères serait un bon choix).

  • MySQL échouera silencieusement si elle est trop courte. J'ai vu cela se produire plusieurs fois auparavant.

Sur une note ajoutée:

Il est préférable d'utiliser exit; après chaque en-tête, sinon votre code peut vouloir continuer à exécuter.

if (password_verify($_POST['password'], $user['password'])) { 
    $_SESSION['loggedin'] = $user['id']; 
    header("Location:admin.php"); 
    exit; 
} 
else { 
    header("Location:index.php"); 
    exit; 
} 
+0

Ollie Atkins s'il vous plaît vérifier ce qu'il a dit. il est correct –