PHP md5 + salt错误执行

时间:2015-10-14 20:24:31

标签: php mysql

因此,当我尝试执行我的sql代码时,我收到错误(帖子底部的错误消息),该表有效,因为朋友正在处理同一个数据库。我得到了他的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);
     }

错误消息:

  

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在/storage/content/25/133425/..../public_html/kontaktApp/class/CDatabase.php:24堆栈中使用“第1行”附近的正确语法跟踪:#0 /storage/content/25/133425/..../public_html/kontaktApp/class/CDatabase.php(24):PDOStatement-&gt; execute(Array)#1 / storage / content / 25/133425 / .... / public_html / kontaktApp / class / CUser.php(24):CDatabase-&gt; executeQuery('SELECT acronym,...')#2 /storage/content/25/133425/..../public_html /kontaktApp/admin.php(14):CUser-&gt;登录('osf','123')在#storage/content/25/133425/..../public_html/kontaktApp/class中输入#3 {main}第24行/CDatabase.php

1 个答案:

答案 0 :(得分:1)

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

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那么安全。

至于原始问题,它似乎是由于缺少)而导致的解析错误。但是,请认真考虑这里提到的安全问题和其他人的安全问题:)