因此,当我尝试执行我的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
答案 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
那么安全。
至于原始问题,它似乎是由于缺少)
而导致的解析错误。但是,请认真考虑这里提到的安全问题和其他人的安全问题:)