【问题标题】:password_verify() alternative? - PHPpassword_verify() 替代方案? - PHP
【发布时间】:2014-05-14 12:35:23
【问题描述】:

我正在尝试做一个简单的登录,如果你愿意的话。我正在使用 MySQLi,到目前为止它看起来不错。

<?php
    ob_start();

    $myusername = @$_POST['username'];
    $mypassword = @$_POST['password'];

    if (isset($_POST['logged'])) {
        $link->escape_string($myusername);
        $link->escape_string($mypassword);
        $stmt = $link->prepare("SELECT * FROM members WHERE username=?") or die ($link->error);
        $stmt->bind_param('s', $myusername);
        $stmt->execute() or die($stmt->error);
        $stmt->store_result();
        $count = $stmt->num_rows();

        if (!empty($myusername) && !empty($mypassword)) {
            if($count == 1) {
                $rs = $link->query("SELECT * FROM members WHERE username='$myusername'");
                $row = $rs->fetch_array(MYSQLI_ASSOC);
                if (password_verify($mypassword, $row['password'])) {
                    $_SESSION['username'] = $myusername;
                    $_SESSION['first_name'] = $row['first_name'];
                    $_SESSION['last_name'] = $row['last_name'];
                    $_SESSION['email'] = $row['email'];
                    $_SESSION['loggedIn'] = true;
                    header("Location: login.php");
                }
                else {
                    echo "<p style=\"color: red\">Wrong Password</p>";
                }
            }
            else {
                echo "<p style=\"color: red\">Wrong Username</p>";
            }
        }
        else {
            echo "<p style=\"color: red\">Fill in all fields</p>";
        }
    }
?>

它在本地主机上运行良好,但遗憾的是在我的域上不起作用,因为每当我按下登录按钮时,表单就会消失,我什么都没有。我联系了域名提供商,他们告诉我这可能是我的代码中的某些内容。我很确定我的代码很好用,因为它可以在 localhost 服务器上运行。

为了省去麻烦,我想也许我可以使用一个替代方案。但我记得我使用crypt() 将密码存储到数据库中,我相信这些密码是随机生成的。有没有其他方法可以查看用户输入的任何内容的加密版本是否与数据库中的内容匹配?

【问题讨论】:

  • password_verify() 仅适用于 PHP 5.5。如果您的托管公司尚未安装该版本,您的代码将崩溃并出现 undefined function 错误并留下空白屏幕。
  • escape_string 究竟是什么,它不是一个 php 函数?

标签: php passwords


【解决方案1】:

password_verify 适用于 PHP >= 5.5.0,因此您的主机可能没有所需的 PHP 版本。

见:http://docs.php.net/manual/en/function.password-verify.php

你可以试试这样的:

crypt($row['password'], $mypassword) == $mypassword

【讨论】:

  • 嗯.. 我创建了一个用户名和密码为 123 的虚拟帐户,当我输入用户并通过时,它回显“密码错误”。
  • 没关系,我删除了 '== $mypassword' 并用 $mypassword var 切换了 $row['password'] var。
  • 太棒了!我很高兴它做到了:)
【解决方案2】:

password_hash 及其伙伴password_verify 在 PHP >= 5.5 中可用

但是有一个兼容性库/向后移植使它们可用于 PHP >= 5.3.10 https://github.com/ircmaxell/password_compat

【讨论】:

  • 我只使用了库中的两个函数来使 PHP 5.3.10 工作正常:函数 _strlen($binary_string) 和函数 password_verify()。效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2020-09-20
  • 2014-06-06
  • 2013-12-22
相关资源
最近更新 更多