Отсутствует проверка пароля - PullRequest
0 голосов
/ 29 декабря 2010

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

PHP:

      session_start(); 

      //Checks if there is a login cookie

      if(isset($_COOKIE['ID_my_site']))


     //if there is, it logs you in and directes you to the members page

     { 
       $email = $_COOKIE['ID_my_site']; 

        $pass = $_COOKIE['Key_my_site'];

           $check = mysql_query("SELECT * FROM accounts WHERE email = '$email'")or              die(mysql_error());

        while($info = mysql_fetch_array( $check ))  

        {

           if ($pass != $info['password']) 

                    {

                          }

           else

             {

               header("Location: home.php");



               }

            }

        }


     //if the login form is submitted 

    if (isset($_POST['submit'])) { // if form has been submitted



     // makes sure they filled it in

           if(!$_POST['email'] | !$_POST['password']) {

           die('You did not fill in a required field.');

          }

          // checks it against the database



           if (!get_magic_quotes_gpc()) {

             $_POST['email'] = addslashes($_POST['email']);

          }

          $check = mysql_query("SELECT * FROM accounts WHERE email = '".$_POST['email']."'")or die(mysql_error());



        //Gives error if user dosen't exist

     $check2 = mysql_num_rows($check);

     if ($check2 == 0) {

               die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>');

            }

            while($info = mysql_fetch_array( $check ))  

        {

         $_POST['password'] = stripslashes($_POST['password']);

     $info['password'] = stripslashes($info['password']);

      $_POST['password'] = md5($_POST['password']);



     //gives error if the password is wrong

        if ($_POST['password'] != $info['password']) {

          die('Incorrect password, please try again.');

        }

         else 

        { 


              // if login is ok then we add a cookie 

           $_POST['email'] = stripslashes($_POST['email']); 

           $hour = time() + 3600; 

              setcookie(ID_my_site, $_POST['email'], $hour); 

              setcookie(Key_my_site, $_POST['password'], $hour);     



                //then redirect them to the members area 

              header("Location: home.php"); 

          } 

           } 

        } 

     else 

  {  



      // if they are not logged in 



     <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> 

      <table border="0"> 

    <tr><td colspan=2><h1>Login</h1></td></tr> 

    <tr><td>email:</td><td> 

    <input type="text" name="email" maxlength="40"> 

     </td></tr> 

       <tr><td>Password:</td><td> 

    <input type="password" name="password" maxlength="50"> 

    </td></tr> 

     <tr><td colspan="2" align="right"> 

    <input type="submit" name="submit" value="Login"> 

    </td></tr> 

  </table> 

   </form> 

}

Вот регистрационный код:

PHP:

       // here we encrypt the password and add slashes if needed
        $_POST['password'] = md5($_POST['password']);
         if (!get_magic_quotes_gpc()) {
      $_POST['password'] = mysql_escape_string($_POST['password']);
     $_POST['email'] = mysql_escape_string($_POST['email']);
      $_POST['full_name'] = mysql_escape_string($_POST['full_name']);
     $_POST['user_url'] = mysql_escape_string($_POST['user_url']);
        }


        // now we insert it into the database
    $insert = "INSERT INTO accounts (Uniquer, Full_name, Email, Password, User_url)
  VALUES ('".$uniquer."','".$_POST['full_name']."', '".$_POST['email']."','".$_POST['password']."', '".$_POST['user_url']."')";
    $add_member = mysql_query($insert);

После использования функции ini_set я увидел ошибку, получаю это сообщение, но не уверен, что оно означает:

There are the lines where the errors are at: 

                if ($pass != $info['password']) 

и эта строка

                        if ($_POST['password'] != $info['password']) {

Ответы [ 4 ]

1 голос
/ 29 декабря 2010

Вы пытаетесь получить доступ к полю БД с помощью $info['password'], но поле базы данных на самом деле Password с большой буквы P .

Вы звоните mysql_escape_string для храненияданные в БД и вызов stripslashes в представленной форме входа в систему.Возможно, они делают разные вещи с паролем.Еще несколько вещей для размышления:

  • Если вы md5 пароль для хранения его в БД, вам не нужно звонить stripslashes или mysql_escape_string наЭто.Он уже преобразован только в буквенно-цифровые символы.
  • mysql_escape_string устарел.
  • Вместо того, чтобы экранировать поле электронной почты, вам может быть лучше проверить его формат.

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

1 голос
/ 29 декабря 2010

Единственное, что я вижу, это то, что вы используете stripslashes для опубликованного пароля (не для md5-версии), но используете его для версии md5 для сохраненного пароля.

Вам не следуетнеобходимо использовать stripslashes для пароля в базе данных, поскольку пароль не должен храниться с косой чертой для начала.

Что произойдет, если вы измените:

$_POST['password'] = stripslashes($_POST['password']);
$info['password'] = stripslashes($info['password']);
$_POST['password'] = md5($_POST['password']);

На:

$_POST['password'] = md5($_POST['password']);
$_POST['password'] = stripslashes($_POST['password']);
$info['password'] = stripslashes($info['password']);
0 голосов
/ 29 декабря 2010

Я решил это, если вы заметили, что в запросах написано SELECT *, вместо этого я попытался выбрать SELECT email, пароль.

0 голосов
/ 29 декабря 2010

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

Разрешает ли ваше поле пароля 32 символа для хэша md5?Слишком короткое поле пароля усекает хэш md5, поэтому всегда происходит сбой при входе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...