所以当我尝试执行我的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 (execute function)
public function executeQuery($sql)
{
$stmt = $this->conn->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
错误味精:
致命错误:未捕获异常'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在/storage/content/25/133425/..../public_html/kontaktApp/class/CDatabase.php中"at line 1"附近使用正确的语法: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
安全。
对于最初的问题,似乎是由于缺少)
而导致的解析错误。但是,请认真对待这里和其他人在评论中提到的安全问题:)