2014-09-21 1 views
0

я могу зарегистрировать пользователя, но при попытке войти в систему с этим, у меня 2 вопроса:Мой Логин не будет работать

1: Я могу войти в, используя имя пользователя, но я могу также введите то, что я хочу в разделе ввода пароля, и я все равно войду в систему (он не проверяет реальный пароль в базе данных)

2: Когда я пытаюсь использовать комбинацию с электронной почтой и паролем, тогда я НЕ МОЖЕТ войти в систему -in, я получаю сообщение об ошибке msg.

Я думаю, что проблема заключается в моем $query select FROM members бла-бла ... но я не уверен.
Извините за то, что вы такой noob.

Это register.php

<form method="post" action=""> 

<input type="text" name="username" placeholder="USERNAME"> 

<input type="password" name="password1" placeholder="PASSWORD"> 

<input type="password" name="password2" placeholder="CONFIRM PASSWORD"> 

<input type="text" name="email" placeholder="E-MAIL"> 

<input type="date" name="age" id="age" > 


<input type="radio" value="male" name="gender" checked> 
<input type="radio" value="female" name="gender"> 


<input type="submit" value="SIGN UP" name="create_member"> 
</form> 



<?php 

require_once ("core/connect.php"); 

if(isset($_POST['create_member'])) 
{ 
    $username = mysqli_real_escape_string($dbc, trim ($_POST['username'])); 
    $password1 = mysqli_real_escape_string($dbc, trim ($_POST['password1'])); 
    $password2 = mysqli_real_escape_string($dbc, trim ($_POST['password2'])); 
    $email = mysqli_real_escape_string($dbc, trim ($_POST['email'])); 
    $age = mysqli_real_escape_string($dbc, trim ($_POST['age'])); 
    $gender = mysqli_real_escape_string($dbc, trim ($_POST['gender'])); 

    if($password1 != $password2) 
    { 
     echo 'THE TWO PASSWORDS ARE NOT THE SAME'; 
    } 

    $hash = hash('sha256', $password1); 

    function createSalt() 
    { 
     $text = md5(uniqid(rand(), true)); 
     return substr($text, 0, 3); 
    } 

    $salt = createSalt(); 
    $password = hash('sha256', $salt . $hash); 

    if(!empty($username) && !empty($email) && !empty($password) && !empty($age) && !empty($gender)) 

    { 
     $query_ind = "INSERT INTO members VALUES ('', '$username', '$password', '$email', '$age' , '$gender', '$salt', NOW())"; 
     mysqli_query($dbc, $query_ind); 

    } 
    else 
    { 
     echo "FILL OUT THE FORM PLEASE"; 
    } 
} 
?> 

и это login.php

<?php 

$error_msg = ''; 

    if (isset($_POST['member_login'])) 
    { 
     // Grab the user-entered log-in data 
     $member_username = mysqli_real_escape_string($dbc, trim($_POST['username'])); 
     $member_email = mysqli_real_escape_string($dbc, trim($_POST['username'])); 
     $member_password = mysqli_real_escape_string($dbc, trim($_POST['password'])); 


     if (!empty($member_username) && !empty($member_password)) 
     { 
      // Look up the username and password in the database 
      $query = "SELECT * FROM members WHERE member_username = '$member_username' OR member_email = '$member_email' AND member_password = '$member_password'"; // SHA('$member_password')"; 

      $data = mysqli_query($dbc, $query); 

      if (mysqli_num_rows($data) == 1) 
      { 
       // The log-in is OK so set the user ID and username session vars (and cookies), and redirect to the home page 
       $row = mysqli_fetch_array($data); 

       $_SESSION['member_id'] = $row['member_id']; 
       $_SESSION['member_username'] = $row['member_username']; 
       $_SESSION['member_email'] = $row['member_email']; 

       setcookie('member_id', $row['member_id'], time() + (60 * 60 * 24 * 7)); // expires in 7 days 
       setcookie('member_username', $row['member_username'], time() + (60 * 60 * 24 * 7)); // expires in 7 days 
       setcookie('member_email', $row['member_email'], time() + (60 * 60 * 24 * 7)); // expires in 7 days 

       header('Location: ' . $_SERVER['PHP_SELF'] . '?page=mlog_in'); 


      } 
      else 
      { 
       // The username/password are incorrect so set an error message 
       $error_msg = ' INCORRECT INFOMATION, TRY AGAIN. '; 
      } 
     } 
     else 
     { 
     // The username/password weren't entered so set an error message 
     $error_msg = ' INCORRECT INFOMATION, TRY AGAIN. '; 
     } 
    } 

    mysqli_close($dbc); 

if(!isset($_SESSION['member_id'])) 
{ 
    ?> 
      <div class="sixteen columns"> 
      <h2>LOGIN</h2> 
      <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post" class="sixteen columns"> 

      <input required type="text" name="username" placeholder="USERNAME/E-MAIL"/> 
      <input required type="password" name="password" placeholder="PASSWORD" /> 

      <input required type="submit" name="member_login" value="LOGIN" /> 

      <input type="checkbox" name="remember" value="1"><span>REMEMBER ME</span> 

       <?php 
        echo '<p>' . $error_msg . '</p>'; 
       ?> 

      <?php 
      echo '<a href="index.php?page=register" title="CLICK TO SIGN UP">MAKE A PROFILE</a>'; 
      ?> 


     </form> 
     </div> 

    <?php 
} 


    else 
{ 
    $profile = ''; 
    if(isset($_GET['profile'])) 
    { 
     $profile = $_GET['profile']; 
    } 

    ?> 


    <?php 
     switch($profile) 
     { 

      default : 
       require_once 'profile/userpage.php'; 
      break; 

     } 
} 

?> 
+1

Вам необходимо слить соль с паролем. и вы не переучиваете его для проверки пароля. –

+0

Что вы подразумеваете под «переутомлением» его для проверки пароля? –

ответ

0

Ваш SQL запрос соответствия либо member_username = '$member_username' или member_email = '$member_email' AND member_password = '$member_password' Попробуйте изменить его

SELECT * 
FROM members 
WHERE member_password = '$member_password' 
AND (member_username = '$member_username' OR member_email = '$member_email'); 

См. Operator Precedence in Mysql для м рудная информация.

1

Есть две проблемы с вашим логином. Оба относятся к вашему SELECT, но по разным причинам.

Во-первых, логические операторы AND и OR являются именно такими: операторами. Как и математические операторы, они имеют порядок операций. Точно так же, как вы делаете умножение перед добавлением, вы делаете AND до OR.

Теперь давайте более подробно рассмотрим ваш SELECT, заменив несколько переменных для ясности.

WHERE username=$username OR email=$email AND password=$password 

Если мы следим за порядком операций, который означает, что «email = $ email AND password = $ password» будет оценен первым. Если они пытаются войти в систему с использованием имени пользователя, это всегда будет ложным, потому что имя пользователя не равно электронной почте. Новое уравнение выглядит следующим образом:

WHERE username=$username OR false 

Поскольку они пытаются войти в систему, используя имя пользователя, первая часть выражения будет вычисляться так, то есть все выражение будет оценивать в действительности. Поэтому, когда вы пытаетесь войти в систему с именем пользователя, не имеет значения, какой пароль вы используете.

Теперь, если они пытаются войти с помощью электронной почты. В этом случае вы забыли хэш-пароль, чтобы пароль базы данных никогда не соответствовал переменной пароля.

Надеюсь, что очистит его.