Я пытаюсь настроить область членов 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.
Спасибо всем!