【问题标题】:Nusoap doesn't work with PHP password_hash function?Nusoap 不适用于 PHP password_hash 函数?
【发布时间】:2016-02-06 02:55:09
【问题描述】:

我正在为 .net 的登录过程编写一个简单的 Web 服务。我在服务器端使用 nusoap php 库。在该服务器端,我正在散列给定密码并在数据库中查询它以检查是否存在这样的散列密码。但在.net 中,我收到错误消息,响应是文本/html 格式,而它正在等待文本/xml 格式。错误是 password_hash 函数没有找到,但这是 php 的内置函数。我检查了单独的 .php 文件中的函数,它在加密和解密(password_verify)时没有错误。那么在这种情况下我哪里出错了?

这是我的代码;

function systemLogin($mycomplexlogin)
{
    $result=NULL;
    $conn=openConnection();
    // Check connection
    if ($conn->connect_error)
    {
        //return("Connection failed: " . $conn->connect_error);
        return $result;
    } 
    $EnterpriseId=mysqli_real_escape_string($conn,$mycomplexlogin["EnterpriseId"]);
    $UserName=mysqli_real_escape_string($conn,$mycomplexlogin["UserName"]);
    $Password=$mycomplexlogin["Password"];
    $cost=10;
    $hash="";
    $hash=password_hash($Password, PASSWORD_BCRYPT, ["cost" => $cost]);
    /* create a prepared statement */
    $stmt =  $conn->stmt_init();
    // prepare and bind
    if($stmt = $conn->prepare("SELECT * FROM mydatabase.USERS WHERE BINARY  username=?"))
    {
        $stmt->bind_param("s", $UserName);
        // execute query
        $stmt->execute();
        /* bind result variables */
        $stmt->bind_result($resultId,$resultLastName,$resultFirstName,$resultAddress,$resultPosition,$resultManager,$resultUserName,$resultPass);
        /* fetch value */
        if($stmt->fetch()) 
        {
            if(password_verify($Password,$hash))
            {
            //date("Y-m-d H:i:s");
            $token=date("Y-m-d H:i:s");
            $result= array(
            'Id' => $resultId,
            'LastName'=>$resultLastName,
            'FirstName' => $resultFirstName,
            'Address'=>$resultAddress,
            'Position'=>$resultPosition,
            'Manager'=>$resultManager,
            'Password' => $resultPass,
            'UserName' => $resultUserName,
            'Token' => $token
            );
            }
        }
        // close statement
        $stmt->close();
    }
    mysqli_close($conn);
    return $result;
}

【问题讨论】:

  • 我忘了提及我已经在数据库中定义了一个客户端,并且已经存储了它的哈希密码。

标签: php web-services nusoap


【解决方案1】:

您的标头似乎有问题。 服务器应该正在发回

header("Content-Type: text/xml\r\n");

而是将其送回

header("Content-Type: text/html\r\n");

也许检查您的 WSDL 文件或找出为什么不将 xml 输出回客户端

我想知道您是否遇到此错误https://github.com/fergusean/nusoap/blob/463c772ae805aed7f396d89e6dce1dc0ce4c038b/lib/class.soap_server.php#L295

【讨论】:

  • 我检查了这个,但它不起作用。仅当我使用 password_hash 或 password_verify 函数时,它才会出错。当我删除此方法时,我的功能有效。 Password_hash 函数返回 '\' 字符可能会导致错误,但我不确定,我必须使用这些方法。
  • 所以在后台 password_hash 是在 Windows 上使用 CryptGenRandom。我想知道这是否不可用。您正在运行什么版本的 PHP?你也许可以试试这个github.com/ircmaxell/password_compat
  • 感谢您的建议,同时我尝试了这个库,它运行良好。
【解决方案2】:

更新# 我找到了解决方案。在 PHP-7 中,即使 PHP 的手册页说 password_hash 是内置的,当我在 nusoaps 服务器端调用它时,它也无法识别此函数。当我称它为单独的 .php 页面时,它可以工作。 所以最后我从github 下载了密码哈希库,它运行良好。 我想,我错误地安装了 PHP-7 或者它是一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2011-09-22
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多