>我创建了一个脚本来将用户登录到网站,但是即使使用正确的密码,我也永远无法进行身份验证。 其他一切正常。在文本框中键入用户名和密码后,按登录按钮即可激活此脚本。下面是脚本:
<?php
session_start();
include('connection.php');
//STEP 2 Declare Variables
$Name = $_POST['username'];
$Pass = md5($_POST['password']); // Encrypt password with md5() function.
$Query = mysql_query("SELECT * FROM Users WHERE username='$Name' AND password='$Pass'");
$NumRows = mysql_num_rows($Query);
$_SESSION['username'] = $Name;
$_SESSION['password'] = $Pass;
//STEP 3 Check to See If User Entered All Of The Information
if(empty($_SESSION['username']) || empty($_SESSION['password']))
{
die("Go back and login before you visit this page!");
}
if($Name && $Pass == "")
{
die("Please enter in a name and password!");
}
if($Name == "")
{
die("Please enter your name!" . "</br>");
}
if($Pass == "")
{
die("Please enter a password!");
echo "</br>";
}
//STEP 4 Check Username And Password With The MySQL Database
if($NumRows)
{
// If The User Makes It Here Then That Means He Logged In Successfully
echo "";
$_SESSION['username']=$Database_Name;
}
else
{
die("Incorrect Username or Password!");
}
?>
登录后,我得到"不正确的用户名或密码!",即使输入的用户名和密码是正确的。密码在数据库中以 md5() 哈希形式输入。这个脚本在我第一次创建它时几年前就工作了。下面发布的是数据库的屏幕截图。任何帮助将不胜感激
这是我数据库中一个名为Bob的用户的图片,他使用单词"密码"的MD5哈希作为他的密码。
这是他尝试登录时回显结果的图片。
此代码:
if($NumRows != 0)
{
while($Row = mysql_fetch_assoc($Query))
{
$Database_Name = $Row['username'];
$Database_Pass = $Row['password'];
}
}
else
{
die("Incorrect Username or Password!");
}
if($Name == $Database_Name && $Pass == $Database_Pass)
{
// If The User Makes It Here Then That Means He Logged In Successfully
echo "";
$_SESSION['username']=$Database_Name;
}
只需使用mysql_num_rows
即可简化:
if($NumRows) {
// If The User Makes It Here Then That Means He Logged In Successfully
echo "";
$_SESSION['username']=$Database_Name;
} else {
die("Incorrect Username or Password!");
}
解释:
由于您使用的是 mysql_num_rows
,如果您的查询匹配,它将返回1
行,因此用户已经过身份验证,否则它将返回0
。使用mysql_fetch_assoc
然后比较结果是多余的。
如果一行匹配,if($NumRows)
将返回1
,并且1
true
。
更新:
这很可能是由于数据库中的字段长度太短而无法成功插入整个md5()
哈希。因此,后半部分没有成功插入。
重要:
您不应该使用 MySQL
,因为它已被弃用,请改用MySQLi
。 MySQL
函数在 PHP 7 中不可用。
另外,您需要通过使用 mysql_real_escape_string
来防止 MySQL 注入。
md5()
不是存储密码的非常安全的方式,而是使用 crypt()
.