Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 密码散列为';不允许用户登录到他们的帐户_Php_Security_Password Encryption_Php 5.5 - Fatal编程技术网

Php 密码散列为';不允许用户登录到他们的帐户

Php 密码散列为';不允许用户登录到他们的帐户,php,security,password-encryption,php-5.5,Php,Security,Password Encryption,Php 5.5,最近我更新了我的登录系统,使用password\u hash(),但它不允许我的用户登录,我曾经使用md5(),因此您可能会发现它急需更新。因此,我将在下面留下相关代码,非常感谢您的帮助 Users.php代码 function recover($mode, $email) { $mode = sanitize($mode); $email = sanitize($email); $user_data = user_data(user_id_from_email($em

最近我更新了我的登录系统,使用
password\u hash()
,但它不允许我的用户登录,我曾经使用
md5()
,因此您可能会发现它急需更新。因此,我将在下面留下相关代码,非常感谢您的帮助

Users.php代码

function recover($mode, $email) {
    $mode = sanitize($mode);
    $email = sanitize($email);

    $user_data = user_data(user_id_from_email($email), 'first_name', 'user_id', 'username', 'email', 'email_code');

    if ($mode == 'password') {
        $generated_password = substr(password_hash(rand(999, 999999), CRYPT_BLOWFISH), 0, 14);
        change_password($user_data['user_id'], $generated_password);

        update_user($user_data['user_id'], array('password_recover' => '1'));

        email($email, 'Your new password', "Hello " . $user_data['first_name'] . ",\n\nWe received a request to recover your account.\n\nYour new password is: " . $generated_password . "\n\n - FGS");
    }
}

function change_password($user_id, $password) {
    $user_id = (int)$user_id;
    $password = password_hash($password, CRYPT_BLOWFISH);

    mysql_query("UPDATE `users` SET `password` = '$password', `password_recover` = 0 WHERE `user_id` = $user_id");
}

function register_user($register_data) {
    array_walk($register_data, 'array_sanitize');
    $register_data['password'] = password_hash($register_data['password'], CRYPT_BLOWFISH);

    $fields = '`' . implode('`, `', array_keys($register_data)) . '`';
    $data = '\'' . implode('\', \'', $register_data) . '\'';

    mysql_query("INSERT INTO `users` ($fields) VALUES ($data)");

    email($register_data['email'], 'Your Account', "Hello " . $register_data['first_name'] . ",\n\nYour account is waiting moderation! Thanks for joining us. All you'll need to now is wait and we'll send you a email when your account has been activated just send a message from your GTA account and let us know that you registered your registration will only be successful if you are part of the FGS Crew if you decide to leave your account will become suspended \n\n- FGS");
}
function login($username, $password) {
    $user_id = user_id_from_username($username);

    $username = sanitize($username);
    $password = password_hash($password, CRYPT_BLOWFISH);

    return mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0 == 1) ? $user_id : false;
}
Login.php代码

include ("$_SERVER[DOCUMENT_ROOT]/autoload.php");

logged_in_redirect();

if(isset($_GET['signin'])){
    $errors[] = 'You need to be logged in to do that';
}
if(isset($_GET['relogin'])){
    $errors[] = '<strong>There was a problem - </strong>Please try again, and if the problem persists then please contact ' . $title . '';
}

if (empty($_POST) === false) {
     $username = $_POST['username'];
     $password = $_POST['password'];

    if (empty($username) === true || empty($password) === true){
        $errors[] = 'You need to enter your username and password';
    } else if (user_exists($username) === false) {
        $errors[] = 'That user doesn\'t exist have you registered?';
    } else if (user_active($username) === false) {
        $errors[] = 'Your account is awaiting moderator approval';
    } else {
        $login = login($username, $password);
        if ($login === false) {
            $errors[] = 'Username and/or password combination is incorrect';
        } else if (user_suspended($username) === true) {
            $errors[] = '<strong>Account Suspended - </strong>Your account has been suspended please contact support for more information';
    } else {
            $_SESSION['user_id'] = $login;
            $user_id = $_SESSION['user_id'];
            mysql_query("UPDATE `users` SET `online_now` = '1' WHERE `user_id` = $user_id");
            header("Location: $url");
            exit();
        }
    }
}
}
   <form action="" method="post">
       <h4>Log In</h4>
       <input type="text" name="username" placeholder="Username" class="no-margin">
       <input type="password" name="password" placeholder="Password" class="no-margin">
       <input type="submit" value="Log In" class="btn no-margin">
   </form>
include(“$\u SERVER[DOCUMENT\u ROOT]/autoload.php”);
已登录_-in_-redirect();
如果(isset($_GET['sign'])){
$errors[]=“您需要登录才能执行此操作”;
}
如果(isset($\u GET['relogin'])){
$errors[]='出现问题-请重试,如果问题仍然存在,请联系'$title';
}
if(空($\u POST)==false){
$username=$_POST['username'];
$password=$_POST['password'];
if(空($username)==true | |空($password)==true){
$errors[]=“您需要输入用户名和密码”;
}else if(user_存在($username)==false){
$errors[]=“该用户不存在,您注册了吗?”;
}else if(用户处于活动状态($username)==false){
$errors[]=“您的帐户正在等待版主批准”;
}否则{
$login=login($username,$password);
如果($login==false){
$errors[]=“用户名和/或密码组合不正确”;
}否则如果(用户_暂停($username)==true){
$errors[]='帐户已挂起-您的帐户已挂起。有关详细信息,请与支持部门联系';
}否则{
$\u会话['user\u id']=$login;
$user\u id=$\u会话['user\u id'];
mysql_查询(“更新`users`SET`online_now`='1',其中`user_id`=$user_id”);
标题(“位置:$url”);
退出();
}
}
}
}
登录

当我修复错误后进入网站时,他们将被要求使用忘记密码页面重置密码。我已经对测试帐户进行了重置,但它仍然不起作用。我不知道你为什么首先获取用户ID,然后计算行数,然后做些什么。您应该只选择用户名与输入和使用相同的行

PS:停止使用不推荐使用的mysql_*函数。PHP不再支持mysql扩展。看看PDO


编辑。考虑使用PaseWordBuffic代替CytTyBuffFISH(它甚至与那个常数一起工作吗?)。这样,PHP将始终使用最新和最强大的实现算法。

请注意,即使使用更好的哈希算法,您的实现也不是非常安全。并应解释为什么以及如何正确使用盐

您不应该再使用mysql_*系列函数了。他们被弃用了。将mysqli_*用于准备好的查询或PDO。有关更多信息,请参阅


你的问题似乎是打字错误。您正在传递
0==1
作为
mysql\u result(..)
的第二个参数。您可能希望在结束(
之后有比较(
==1

当前代码:

mysql_result(
  mysql_query( "SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'" 
  ), 0 == 1
) 
? $user_id : false;
它可能应该是什么:

mysql_result(
  mysql_query( "SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'" 
  ), 0
) 
== 1 ? $user_id : false;

你把散列的验证搞错了

password\u hash()
生成一些随机salt,并与明文密码一起创建hash。这将是不同的每一次

您应该在数据库中找到用户,从中读取存储的散列,然后使用
password\u verify()
查看登录表单中的明文密码是否会导致存储在数据库中的相同散列

如果您随后使用
密码\u needs\u rehash()
检查哈希算法或参数是否有所改进,然后再次哈希并存储密码,则可获得额外积分。这将允许您的所有哈希在用户登录后改进为更好的哈希。如果没有明文密码,则无法执行此操作,只有在用户登录时才有明文密码

$_POST['username'] containing the username from the login form
$_POST['password'] containing the password from the login form

SELECT username, hash FROM users WHERE username = 'username' //do all the escaping

$user = mysqli_fetch_assoc(...);
if (password_verify($_POST['password'], $user['hash'])) {
    // user has the correct password
} else {
    // login fail
}

数据库中所有用户的旧密码都是MD5哈希吗?代码中的ctrl-f for MD5不会显示任何结果。您是否试图在更改后首次登录时将河豚哈希与md5哈希进行比较?@DaveMorrissey我的新密码已通过电子邮件发送给我,并在mySQL中更新,但我无法login@Sumurai8我知道我替换了所有md5字符串,我认为错误在登录函数中,我试图比较提交的纯文本密码对于存储的哈希密码,请参阅手册中有关您正在使用的函数的页面。这里清楚地描述了该过程(您错误地执行了该过程)。我已经尝试使用PASSWORD\u DEFAULT,但仍然无法使用PASSWORD\u verify()将输入的密码与存储的密码进行比较,这与您当前尝试的操作不同。原因:PASSWORD\u hash()的哈希将不同,因为随机生成的salt会有所不同。我如何在login()函数中实现这一点?另外,当使用新算法更新密码\u默认值时,这不意味着如果用户不更改密码,就会被锁定。当我将所有mysql\u结果、mysql\u查询等查询更新为mysqli\u结果、mysqli\u查询时,mysqli_*它完全破坏了整个系统如果你使用mysqli_*系列函数,你需要正确地使用它。到处使用准备好的查询
mysqli
mysql
完全不同。更改它可能不是那么容易。我可以只使用SHA-512吗?使用在您的设置中可接受的时间内运行的最佳算法。我可以只使用SHA-512吗?不。为什么?如果你想做的很好,你必须有一个随机的salt,这必须被添加到密码中,这也需要从数据库中获取。
$_POST['username'] containing the username from the login form
$_POST['password'] containing the password from the login form

SELECT username, hash FROM users WHERE username = 'username' //do all the escaping

$user = mysqli_fetch_assoc(...);
if (password_verify($_POST['password'], $user['hash'])) {
    // user has the correct password
} else {
    // login fail
}