2014-11-09 81 views
0

我一直在尝试写几天的简单登录。在我认为我已经工作了之后,我意识到它会接受密码字段中的任何输入为真,因此我将其废弃并重新开始。我试图使用php函数password_verify进行验证,但无论我做什么,它总是仍然返回true。有什么我做错了吗?这里是我的代码(我知道它不安全,我只是希望它现在识别一个错误的密码)密码验证总是返回true

if(isset($_POST['submit'])) 
{ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $hash = password_hash($password, PASSWORD_DEFAULT); 

    if(password_verify($_POST['password'], $hash)) 
    { 
     echo 0; 
    } 
    else 
    { 
     echo 1; 
    } 
} 
+0

@FerozAkbar它在[PHP核心](http://php.net/password_verify)中。 – 2014-11-09 04:37:19

+1

您正在比较的那个应该是从之前操作中注册的db行中提取的散列密码。 – Ghost 2014-11-09 04:41:36

+1

是你的“完整”代码吗?我怀疑它,因为你把它标记为'mysqli'。告诉我们你是如何使用它的。我有几个使用这两种功能的随时可用的脚本。输入密码 – 2014-11-09 04:42:36

回答

0

您是$password得到一个$_POST['password'];

您是hash一个$password这是$_POST['password'];

password_verify($_POST['password'], $hash) 

您有hash比较一个$_POST['password']hash也是$_POST['password']

这就是为什么他们总是返回true.because $passwod,hash$_POST['password']是相同的。

+0

谢谢,我现在明白了! – 2014-11-09 04:58:50

0

您使用发布密码检查帖子密码。你应该检查后密码,而不是一个想要的密码。

0

您正在为通过POST收到的密码分配$hash

这是怎么password_verify工作

boolean password_verify (string $password , string $hash)

验证给定$hash收到的密码匹配。

因此,现在您正在检查存储在$hash中的密码,并使用在POST中获得的密码相同。

因此总是如此。

2

它总是返回true的原因是因为您正在验证您刚刚创建的哈希值,它将始终得到正确验证。

当您使用password_verify()函数$hash参数必须来自其他地方(通常是某种数据库)。

// If this is a POST request then handle the form 
if ($_SERVER['REQUEST_METHOD'] === 'POST') { 

    // Get password from form 
    $pass = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); 

    // Connect to a database of some kind 
    // Get a previously hashed password 
    $hash = 'A HASH FROM SOMEWHERE ELSE...'; 

    // Verify the previously hashed password 
    // against the password provided by the user 
    if (password_verify($pass, $hash)) { 
     echo 'Password is valid!'; 
    } 
}