2016-03-01 3 views
1

Я создал систему, которая позволяет администратору регистрировать другого администратора с адресом электронной почты и паролем для входа в защищенную область. Администратор регистрируется через эту форму:Почему мой вход в систему не работает?

<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> 

adduser.php выглядит следующим образом:

<?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"); 
    } 
?> 

До здесь, кажется, работает на таблицу с именем пользователи, то получает заполняется данными. Я предполагаю, что потенциально это могло бы использовать $ hash неправильно, чем пароль, хранящийся в таблице, не то, что пользователь вводил в поле пароля?

Когда пользователь пытается войти в систему, используя эту форму:

<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> 

ссылки на этот 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"); 
      } 
      } 
?> 

С правильной электронной почты и пароль, введенный в регистрации с сайта только перезагружает на index.php, а не доставлять их admin.php. Я действительно не могу понять эту проблему здесь, поскольку код тоже выглядит слишком. Я предполагаю, что это проблема с тем, что $ hash фактически сохраняет в поле пароля.

Если кто-то может помочь с этим, это было бы действительно оценено!

+0

Как об этом, зарегистрировать пользователя с простым паролем, как 1234 и проверьте таблицу для хранимой хэш. Затем повторите хеширование 1234, используя тот же метод, посмотрите, соответствуют ли строки. Если они это сделают, проблема не имеет ничего общего с хэшем. – Abdel

+4

и, какова длина столбца паролей? Если он слишком короткий, он терпит неудачу для вас * тихо *. –

+1

Каков результат 'var_dump ($ user)'? –

ответ

3

Поскольку вы не отвечаете на комментарии, я представляю следующее.

Я подозреваю, что длина столбца вашего пароля слишком короткая.

Если это так, вам необходимо установить его на 60+. Итак, ALTER your column, очистите строки паролей, содержащие хеши, создайте новый хеш и повторите попытку.

Руководство по этому вопросу:

PASSWORD_DEFAULT - Используйте алгоритм Bcrypt (по умолчанию, как в PHP 5.5.0). Обратите внимание, что эта константа предназначена для изменения с течением времени, когда новые и более сильные алгоритмы добавляются в PHP. По этой причине длина результата от использования этого идентификатора может меняться со временем. Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором).

  • MySQL потерпит неудачу тихо если он слишком короткий. Я видел это много раз.

На добавленной ноте:

Лучше всего использовать exit; после каждого заголовка, в противном случае ваш код может потребоваться продолжить выполнение.

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

Олли Аткинс, пожалуйста, проверьте, что он сказал. он прав –

Смежные вопросы