PHP md5 + salt 执行错误

标签 php mysql

因此,当我尝试执行我的 sql 代码时,我收到一个错误(错误消息位于帖子底部),该表可以正常工作,因为一个 friend 正在处理同一个数据库。我已经得到了他的 sql 查询,应该可以工作。那么是我的执行函数没有运行 md5 函数吗?如果我不使用 md5 函数并且已建立连接,则可以从表中获取数据。

admin.php(我从中调用函数的地方)

<?php
    include('incl/header.php');
    include('class/CUser.php');
    if($_POST['login'])
    {
        if(isset($_SESSION['secureLogin']))
        {
            header('location: adminPage.php');
        }
        else
        {
            $user = new CUser();
            $res = $user->login($_SESSION['acronym'], $_SESSION['password']);
            if($res == true)
            {
                //$_SESSION['secureLogin']="true";
        //header('location: adminPage.php');

            }
            else
            {
                echo "false";
            }
        }
    }
    if(isset($_SESSION['secureLogin']))
    {
        header('location: adminPage.php');
    }
    else
    {
        echo "go back";
        //header('location: index.php');
    }
    include('incl/footer.php');

CUser.php(登录函数)

public function login($acronym, $password)
    {

        $res = $this->database->executeQuery("SELECT acronym, password FROM CDB_USER WHERE acronym = '$acronym' AND password = md5(concat('$password', salt)");

        print_r($res);
        if(empty($res))

        {
            return false;
        }
        else
        {
            return true;
        }
    }

CDatabase.php(执行函数)

public function executeQuery($sql)
     {
        $stmt = $this->conn->prepare($sql); 
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
     }

错误消息:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1' in /storage/content/25/133425/..../public_html/kontaktApp/class/CDatabase.php:24 Stack trace: #0 /storage/content/25/133425/..../public_html/kontaktApp/class/CDatabase.php(24): PDOStatement->execute(Array) #1 /storage/content/25/133425/..../public_html/kontaktApp/class/CUser.php(24): CDatabase->executeQuery('SELECT acronym,...') #2 /storage/content/25/133425/..../public_html/kontaktApp/admin.php(14): CUser->login('osf', '123') #3 {main} thrown in /storage/content/25/133425/..../public_html/kontaktApp/class/CDatabase.php on line 24

最佳答案

我想指出的第一件事是您的代码存在安全缺陷。永远不要以这种方式将变量插入到查询中。您需要使用准备好的语句。其次,我认为在 MySQL 中使用 md5() 密码并不是一个好主意。这会导致实际密码以明文形式发送到 MySQL 服务器,可能是在没有 TLS/SSL 的连接上。将盐存储在您的代码中,而不是存储在数据库中,然后将密码存储在 PHP 中的 md5() 中。试试这个:

admin.php

public function login($acronym, $password)
{
    $result = $this->database->executeQuery(
        "SELECT acronym, password FROM CDB_USER WHERE acronym = :acronym AND password = :password",
        array(':acronym' => $acronym, ':password' => md5($password . $salt))
    );

    print_r($result);

    return (bool) !empty($result);
}

CDatabase.php

public function executeQuery($sql, $bindValues = null)
{
    $statement = $this->conn->prepare($sql);

    if (is_array($bindValues))
    {
        foreach ($bindValues as $parameter => $value)
        {
            $statement->bindValue($parameter, $value);
        }
    }

    $statement->execute();

    return $statement->fetchAll(PDO::FETCH_ASSOC);
}

我还应该指出,md5() 不是一种非常安全的哈希算法,您可能应该使用 sha1()hash('sha256 ', $password . $salt); 代替。即使 sha1() 虽然比 md5() 好得多,但仍然不如 sha256 安全。

至于原来的问题,似乎是缺少)导致的解析错误。但是,请认真对待此处提到的以及其他人在评论中提到的安全问题:)

关于PHP md5 + salt 执行错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33134919/

相关文章:

Php MySQL简单形式是插入空

mysql 添加自动增量和附加键

php - SQL 中的插入查询花费了很多时间

php - 如何让这个 PHP/MySQL 游戏 map 更加高效?

php - 如何使用空字符串值将实体保存在数据库中

javascript - 如何根据 PHP 端的 bool 变量通过 AJAX 更新和加载不同的 div block ?

php - 如何从 JSON 在 Eloquent ORM 中保存具有相关记录的模型

php - $_GET 无法正常工作

mysql - SQL数据库设计,递归父子关系?

php - 只需使用地址工具栏 php get 方法