从数据库中检索数据时的值不同

时间:2017-12-11 09:50:17

标签: php mysql mysqli

我是PHP和PHP的初学者MySQL开发,我正在按照教程。我正在尝试制作登录系统,在注册后将数据插入Mysql。我想验证数据库中的密码和登录页面中用户的密码,如果匹配,则登录成功。

这是来自数据库的密码,我们可以看到,对于username = admin,密码为 3462623 ..... enter image description here

此数据库的数据类型如下

enter image description here

我们可以看到,password和salt的数据类型是Binary。

当我尝试var_dump存储数据库中值的变量时,密码和salt与数据库中显示的不同。

密码应为: 3462623 ..... 但是从var_dump,密码是: 4bb5d8229634bf5 .....

其他数据,如ID,用户名,电子邮件都是正确的。只是密码和盐是不同的。

enter image description here

我怀疑这是因为var_dump的返回值数据类型是String,但是当我存储到数据库时,数据类型是Binary,我该如何解决?从我看到的教程看来,即使字符串数据类型中的密码,登录系统仍然可以。

老实说,我不明白为什么它必须是二进制数据类型。但我想是因为它会被加密。

所以这里出了什么问题?

这是代码:

注册流程

$username = htmlentities($_REQUEST["username"]);
$password = htmlentities($_REQUEST["password"]);
$fullname = htmlentities($_REQUEST["fullname"]);
$email = htmlentities($_REQUEST["email"]);

if (empty($username) || empty($password) || empty($fullname) || empty($email)) {

    $returnArray = [
        "status" => "400",
        "message" => "missing required information"
    ];

    echo json_encode($returnArray);
    return;
}



//encrypt the password
$salt=openssl_random_pseudo_bytes(20); 
$securedPassword = sha1($password.$salt);



// Create Connection
$file = parse_ini_file("../../../twitter.ini");
$dbhost = trim($file["host"]); 
$dbusername = trim($file["username"]);
$dbpassword = trim($file["password"]);
$dbname = trim($file["dbname"]);


$access = new access($dbhost,$dbusername,$dbpassword,$dbname);
$access->connect();

function registerUser($username,$password,$salt,$email,$fullname) {

        $query = "INSERT INTO users SET username=?, password=?,salt=?,email=?,fullname=?";
        $statement = $this->conn->prepare($query);

        if (!$statement) {
            throw new Exception($statement->error);
        }

        $statement-> bind_param('sssss',$username,$password,$salt,$email,$fullname);
        $returnValue = $statement -> execute();


        return $returnValue;
    }


// Insert data to database
$result = $access->registerUser($username,$securedPassword,$salt,$email,$fullname);

if ($result) {
    // get data from database

    $user = $access->selectUser($username);

    $resultArray = [

        "status" => "200",
        "message" => "Sucessfully registered",
        "id" => $user["id"],
        "username" => $user["username"],
        "email" => $user["email"],
        "avatar" => $user["avatar"],
        "fullname" => $user["fullname"]
    ];

登录过程

$username = htmlentities($_REQUEST["username"]);
$password = htmlentities($_REQUEST["password"]);

if (empty($username) || empty($password)) {

    $returnArray = [
        "status" => "400",
        "message" => "missing required information"
    ];

    echo json_encode($returnArray);
    return;

}


// make connection
$file = parse_ini_file("../../../twitter.ini");
$dbhost = trim($file["host"]); 
$dbusername = trim($file["username"]);
$dbpassword = trim($file["password"]);
$dbname = trim($file["dbname"]);


$access = new access($dbhost,$dbusername,$dbpassword,$dbname);
$access->connect();

$user = $access -> getUserData($username);


if (empty($user)) {
    $returnArray = [
        "status" => "403",
        "message" => "User is not found"
    ];

    echo json_encode($returnArray);
    return;
} else {

    // password validation

    $securedPassword = $user["password"];
    $salt = $user["salt"]; 


    if ($securedPassword === sha1($password.$salt)) {

        $resultArray = [

        "status" => "200",
        "message" => "Login Success!",
        "id" => $user["id"],
        "username" => $user["username"],
        "email" => $user["email"],
        "avatar" => $user["avatar"],
        "fullname" => $user["fullname"]
    ];

    } else {
        $returnArray = [
        "status" => "403",
        "message" => "Password didn't match"
    ];
    }

}


$access ->disconnect();


echo json_encode($returnArray); 

1 个答案:

答案 0 :(得分:0)

正如其他用户所指出的,密码和salt应该是char或varchar甚至是text,而不是二进制文件。

您看到它们之间存在差异的原因是基于访问方法和检索和显示中使用的字符集。

在一种情况下,您正在使用PHP进行检索,然后使用(可能)PRE标签进行显示并在网页上显示。在另一种情况下,您正在phpMyAdmin或其他一些MySQL桌面系统中查看它。这些中的每一个都需要在查看之前进行多次翻译,作为二进制数据,当使用两个不同的路径检索时,它们将不会以相同的方式可靠地显示(phpMyAdmin将以不同方式翻译字符集,然后以不同方式显示结果)。

一个简单的解决方案是切换到非二进制(TEXT / VARCHAR)字段定义。

或者,您可以尝试在MySQL桌面(使用查询,而不仅仅是在表格中显示)和php / mysqli查询中将它们检索为HEX或其他二进制友好显示方法。从本质上讲,您可以将二进制文件转换为已知的文本显示集。