SQL 当我包含加密时,密码字段不起作用

SQL password field does not work when I include encryption

我仍在使用 "PHP and SQL for Dummies 4th edition"。我现在遇到的问题是,如果我应该尝试使用正确的密码登录,我会被告知密码不正确,我通过 PHP 网络文件添加的所有记录都会发生这种情况。我通过 phpmyadmin 添加的记录工作正常(在删除加密语句后),并且在提供正确的密码后我可以访问登录页面。我怀疑问题出在加密上,因为 phpmyadmin 中的密码列包含所有内容的相同密文 ("d41d8cd98f00b204e98009")(通过 phpmyadmin 输入的记录除外,它没有任何加密)。我将包括我的代码中包含加密的部分,也许任何人都可以发现其中的任何错误。 在数据库中检查匹配之前加密输入密码的代码:

if($num > 0) //login name was found 
{
$sql = "SELECT loginName FROM Member 
WHERE loginName='$_POST[fusername]'
AND password=md5('$_POST[fpassword]')";
$result2 = mysqli_query($cxn,$sql) 
or die("Query died: fpassword");
$num2 = mysqli_num_rows($result2); 
if($num2 > 0) //password matches 
{
$_SESSION['auth']="yes"; 
$_SESSION['logname'] = $_POST['fusername'];
$sql = "INSERT INTO Login (loginName,loginTime)
VALUES ('$_SESSION[logname]',NOW())";
$result = mysqli_query($cxn,$sql)
or die("Query died: insert");
header("Location: New_memberpage.php");
}       

在将新注册用户的密码发送到数据库之前对其进行加密的代码:

else // Add new member to database
{
$sql = "INSERT INTO Member (loginName,createDate,
password,firstName,lastName,street,city,
state,zip,phone,fax,email) VALUES
('$loginName',NOW(),md5('$password'),
'$firstName','$lastName','$street','$city',
'$state','$zip','$phone','$fax','$email')";
mysqli_query($cxn,$sql); 
$_SESSION['auth']="yes"; 
$_SESSION['logname'] = $loginName;

我的挑战总结是 username/password 登录方法只有在我通过 phpmyadmin 添加时才能正常工作。我想在网站注册的时候让它生效,为什么我的数据库的密码栏里的所有密文都是一样的,尽管我为它们输入了不同的密码?

d41d8cd98f00b204e9800998ecf8427e 是空字符串的 MD5 散列。所以这里似乎有两件事是错误的:

  1. 密码没有正确传递给您的 SQL 查询。它最终什么都没有散列。

  2. 您的密码列不够宽,无法存储整个哈希值。

但更重要的是,您正在学习的教程存在一些问题:

  • 教你使用"mysql"扩展。 This extension is deprecated, and will not be available in future versions of PHP. "mysqli" 和 "PDO" 扩展是首选,因为它们将在未来继续可用,并且它们支持重要的安全功能,例如准备好的查询和参数占位符。

  • 它似乎没有教您引用传递给 MySQL 查询的值(或者它期望您依赖 magic_quotes,这更糟)。这可能会给您的应用程序带来严重的安全漏洞。

  • 它指示您使用 md5() 作为密码哈希。这不是存储密码的安全方法;一个更好的方法是更新的 password_hash() / password_verify() 函数集。有关详细信息,请参阅 PHP's FAQ on password hashing

我强烈建议您找到更新的参考文本。您使用的那个已经过时了。

我发现了我程序中的错误。我使用相同的变量名 "password" 连接到我的数据库(带空引号)。使用主机、用户名和数据库声明的密码覆盖了我 table 中的密码。我将所有连接 "password" 更改为 "passwrd" 并且能够在我的数据库中查看密码。感谢所有回复,至少我现在知道 md5 对于敏感数据不是很安全。所有变量名称必须始终使用不同的标识符!