【问题标题】:PHP - password_verify() is always returning falsePHP - password_verify() 总是返回 false
【发布时间】:2015-08-14 03:33:39
【问题描述】:

我启动了一个具有基本注册/登录功能的 Android 应用程序。当我注册时,我的应用程序与 PHP 脚本 (PHP 5.6.11) 通信以将数据发送到我的数据库 (PostgreSQL 9.4),这工作正常。

我遇到的问题是我的登录功能,当从数据库中检索我的信息并使用 password_verify(password, db_hash) 验证我的登录时,这似乎永远不会验证为真。

我的示例代码和数据库值如下:

<?php

   // connecting, selecting database
   $dbhost = "host=127.0.0.1";
   $dbport = "port=5432";
   $dbname = "dbname=test";
   $dbcredentials = "user=test_user password=test75";

   $connection = pg_connect("$dbhost $dbport $dbname $dbcredentials");

   /* get user inputs */
   $input_username = $_POST["username"];
   $safe_username = pg_escape_string($input_username);

   $input_password = $_POST["password"];
   $safe_password = pg_escape_string($input_password);

   /* check if user credentials are correct and return user information */
   $query = "SELECT username, password, email FROM \"user\" WHERE username='$safe_username';";
   $result = pg_query($connection, $query);

   /* get database credentials (result, row, value) */
   $result_array = pg_fetch_array($result, 0, PGSQL_NUM);

   $db_username = $result_array[0];
   $db_password = $result_array[1];
   $db_email = $result_array[2];

   if (password_verify($safe_password, $db_password))
   {
      $current .= "Password is valid!" . "\r\n";
   } 
   else 
   {
      $current .= "Invalid password." . "\r\n";
   }

  // dump the result object
   var_dump($result);
   var_dump($db_password);

   // close the connection
   pg_close($connection);

?>

我检查了我的用户名和数据库中的哈希是否返回正常,它们是。数值如下:

用户名 = 测试

密码 = 测试

散列密码 = $2y$10$OIHovXZZ1aAHLL32JkLdeeMXZDcZ8TgcI8TFw5SVCQ9zBiqNc8pP6

为了提供一些额外的信息,我的数据库表配置如下:

CREATE TABLE "user"
(
  userid serial NOT NULL,
  username text NOT NULL,
  password text NOT NULL,
  CONSTRAINT user_pkey PRIMARY KEY (userid)
)
WITH (
  OIDS=FALSE
);

即使在阅读了许多关于这个确切问题的相同帖子后,我似乎也无法解决它。

【问题讨论】:

  • 你应该输出一个 JSON 并做 android JSON 解析代码..
  • 这一行 `$safe_password = pg_escape_string($input_password);` 可能是问题所在。删除它并针对 $input_password 进行测试
  • 我建议使用 pgcrypto 扩展,它提供了基本但安全的方法来加密和检查密码。
  • #1 - 抱歉,我不确定你的意思。我真的在尝试使用 PHP 加密/解密我的密码。 #2 - 我尝试了 $input_password,它没有用。我还尝试从我将信息提交到注册时删除“pg_escape_string”,但它仍然没有用。 #3 - 我真的很想使用这个功能,它非常简单(即使我遇到了问题)。

标签: php postgresql


【解决方案1】:

我遇到了同样的问题,在寻找解决方案后我发现了这个

pg_fetch_array($sql_request)['password']只能被调用1次,之后一直返回false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多