gpt4 book ai didi

php - 从 MySQL 数据库检索时 AES_DECRYPT 出现问题

转载 作者:行者123 更新时间:2023-11-29 00:03:22 25 4
gpt4 key购买 nike

好的,我有这个页面,它应该允许用户使用他们的密码登录,该密码在数据库中使用 AES 加密。我想从数据库中提取加密密码,解密并将其与用户输入的密码进行比较。这是我的代码:

<?php
session_start();
$validUser = false;

// see if they want to logout from a current session

$tOption = $_GET['cmd'];

if($tOption=="logout") {
unset($_SESSION['SAFEUSER']);
}

?>
<html>
<body>
<?php

// are they attempting to log into the menu?

// alternative syntax that uses the submit button's value
// if( $_POST['Fsubmit'] == "lookupnow" ) {


if( ($_POST['Femail'] > "") or ($_POST['Fpassword'] > "") ) {
// look 'em up in the database to validate credentials

// establish values for DB credentials
$hostname = 'localhost';
$dbname = '';
$username = '';
$userpass = '';
$passkey = "sgjbasjgbaslhflshfoashf";

// get connected to the DB
try {

$DBH = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $userpass);

}
catch(PDOException $e) {
echo $e->getMessage();
}

$tEmail = $_POST['Femail'];
$tPassword = $_POST['Fpassword'];

/*$secureSQL = 'SELECT FirstName, LastName, Phone from Members WHERE Email="'
. $tEmail . '" AND Password="' . $tPassword . '"';*/

$secureSQL = 'SELECT FirstName, LastName, Phone from Members WHERE Email="'
. $tEmail . '" AND AES_DECRYPT(Password, $passkey) ="' . $tPassword . '"';

//echo $secureSQL . "<br>";

// estalish SQL query
$STH = $DBH->query($secureSQL);

# setting the fetch mode -- this comes into effect when the fetch() function is called
$STH->setFetchMode(PDO::FETCH_ASSOC);

while($row = $STH->fetch()) {
$validUser = true;
$_SESSION['SAFEUSER'] = true;
}
if($validUser==false) {
echo "<font color='red'>Those credentials were not authenticated.</font><br/><br/>";
}


}

// are they logged in?

if(!$_SESSION['SAFEUSER']) {
// if not, make them login
?>
Please enter your credentials:<br />
<form method="post" action="mysecuremenu.php">
Your email address: <input type="text" name="Femail"><br>
Your password: <input type="password" name="Fpassword"></br>
<input type="submit" name="Fsubmit" value="lookupnow">
</form>

<?php
} else {
// otherwise, show them the menu
?>
<h2>Please select one of the following:</h2>
<ul>
<li><a href="MySecureFirstDBForm.php">Enter a new employee</a></li>
<li><a href="mySecuredbviewall_withdatatable.php">View all employees</a></li>
<li><a href="mysecuremenu.php?cmd=logout">Logout</a></li>
</ul>

<?php

} // end if(safeuser)

?>
</body>
</html>

我收到这个错误:

Fatal error: Call to a member function setFetchMode() on a non-object on line 58

我觉得它必须与我的 SELECT 语句有关,因为我在上面注释掉的语句对于使用非加密密码登录来说效果很好。我将不胜感激任何帮助。谢谢!

最佳答案

您的查询中存在语法错误,稍后会详细介绍。如果您检查对 PDO 的调用是否有错误,您就会找到它。除非您要求,否则 PDO 不会显式标记错误,因此您需要检查对 $DBH->query(...)

$STH = $DBH->query($secureSQL);
if ($STH === false) {
$errorInfo = $DBH->errorInfo();
echo $errorInfo[0].':'.$errorInfo[1].' ('.$errorInfo[2].')';
exit;
}

(您可以将 PDO 设置为在遇到错误时抛出异常,并使用 try...catch block 来处理它。这是给读者的练习)

现在 - 语法错误。您正在像这样构建查询:

 $secureSQL = 
'SELECT FirstName, LastName, Phone from Members WHERE Email="'
. $tEmail . '" AND AES_DECRYPT(Password, $passkey) ="' . $tPassword . '"';

您已尝试对 $passkey 变量进行插值,但字符串的那部分包含在单引号中,因此插值不起作用。您已经连接了其余参数,因此不清楚为什么您在这里做了一些不同的事情。

您还省略了将 $passkey 括起来的单引号,因此即使插值有效,查询也会失败。简单地交换使用单引号和双引号会使这更容易。

你需要这个:

 $secureSQL = 
"SELECT FirstName, LastName, Phone from Members WHERE Email='"
. $tEmail . "' AND AES_DECRYPT(Password, '$passkey') ='" . $tPassword . "'";

还有更多。

您已将用户输入直接添加到查询字符串中,没有任何形式的转义。这使您对 SQL 注入(inject)敞开大门。将其与加密密码结合使用,您就可以公开邀请黑客袭击您的数据库。至少您应该使用 PDO::quote() 来转义变量,但更好的方法是使用准备好的语句并完全避免注入(inject)风险。 (读者的另一个练习)。

最后(这已在评论中提及)不要加密密码 - 散列它们 PHP 在 PHP 5.5+ 中为此目的提供了 password_hash(),并且有是一个可以用于早期版本的垫片。

如果您的教授正在教您使用 AES_ENCRYPT() 来保护密码,您真的应该让他来解决这个问题。

关于php - 从 MySQL 数据库检索时 AES_DECRYPT 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com