因此,当我尝试执行我的 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/