Пароль никогда не работает в системе входа в PHP - PullRequest
0 голосов
/ 19 декабря 2011

Я пытаюсь настроить область членов PHP на своем веб-сервере, которая хэширует и отправляет соленые пароли.Я зарегистрировал учетную запись и проверил базу данных - пользователь создан, как и ожидалось - все выглядело хорошо.Проблема в том, что всякий раз, когда я пытаюсь войти в систему, он говорит, что логин неверный (имя пользователя или пароль).Конечно, это делается в тестовой области, и имя пользователя и пароль, которые я зарегистрировал, должны работать - но это не так.

auth.php: должен аутентифицировать пользователя и создатьсеанс, если данные верны // логин никогда не работает

<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

if (strlen($username)<3 || strlen($password)<3) {
    header('Location: log_in.php5?error=1');
    die();
}

$username = mysql_real_escape_string($username);

function validateUser() {
    session_regenerate_id ();
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $username;
}

include "../db_login.php5";
mysql_select_db("DB_NAME", $con);

$query = "SELECT password, salt
        FROM users
        WHERE username = '" . $username . "';";

$result = mysql_query($query);

$userData = mysql_fetch_assoc($result);
$count = mysql_num_rows($userData);

if ($count < 1) {
    header('Location: log_in.php5?error=1');
    die();
}

$salt = "";
$hashed_pass = "";

for ($x=0; $x<1; $x++) {
  $salt = $userData['salt'];
  $hashed_pass = $userData['password'];
}

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

mysql_close($con);

if ($hash != $hashed_pass) {
    header('Location: log_in.php5?error=1');
    die();
} else {
    validateUser();
}

header('Location: members.php5');
?>

register.php: должен взять имя пользователя, хешировать пароль с солью, сохранить все 3 в БД //works

<?php
//retrieve our data from POST
$username = $_POST['username'];
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
if($pass1 != $pass2)
    header('Location: sign_up.php5');
if(strlen($username) > 30)
    header('Location: sign_up.php5');

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

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

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

include "../db_register.php5";
mysql_select_db("DB_NAME", $con);

//sanitize username
$username = mysql_real_escape_string($username);
$query = "INSERT INTO users (username, password, salt)
        VALUES ( '$username' , '$hash' , '$salt' );";
mysql_query($query);
mysql_close($con);

header('Location: log_in.php5');
?>

Файл login.php представляет собой простую форму, которая отправляет данные в auth.php;файл sign_up.php также представляет собой простую форму, которая отправляет данные пользователя в register.php.

Что не так с моим кодом, так как он не позволяет мне войти в систему?

РЕДАКТИРОВАТЬ:

Итак, я сузил проблему, чтобы переменная $ username, которая кажется пустой с самого начала?

output:

Count: 
User: 
Query: SELECT * FROM `users` WHERE `username`='';

код для вывода:

$query = "SELECT * 
FROM `users` 
WHERE `username`='".$username."';";

$result = mysql_query($query);

$userData = mysql_fetch_assoc($result);
$count = mysql_num_rows($userData);

if ($count < 1) {
    echo "Count: ".$count."<BR/>"
    . "User: " .$username ."<BR/>"
    . "Query: " .$query;
    //header('Location: log_in.php5?error=1,count='.$count.'user='.$username);
    //die();
}

$ count и $ username не печатаются ни в адресе, ни в sql-запросе

EDIT 2:

*Jared* eventually found the problems which were two in number:
1) $username = mysql_real_escape_string($username); <-- required a db connection $con in my case
2) $count = mysql_num_rows($userData); <-- required to pass the $result instead.

Спасибо всем!

1 Ответ

2 голосов
/ 19 декабря 2011

Что с этой частью?

for ($x=0; $x<1; $x++) {
  $salt = $userData['salt'];
  $hashed_pass = $userData['password'];
}

Сделайте var_dump из $userData.

РЕДАКТИРОВАТЬ

function validateUser($username) {
    session_regenerate_id ();
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $username;
}

и около дна:

if ($hash != $hashed_pass) {
    header('Location: log_in.php5?error=1');
    die();
} else {
    validateUser($username);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...