2016-03-13 148 views
0

我创建了一个脚本来将用户登录到网站,但是我永远无法获得身份验证,即使使用正确的密码。其他一切正常工作。在文本框中输入用户名和密码后按下登录按钮即可激活此脚本。以下是脚本:Php登录脚本根本没有登录

<?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()在数据库中的散列值。这个脚本几年前在我第一次创建它时就工作了。下面发布的是DB的屏幕截图。任何帮助将不胜感激

下面是一个用户的图片在我DB named Bob who is using an MD5 hash of the word "Password" as his Password.

这里是呼应results的照片时,他尝试登录。

+1

您当前的代码具有SQL注入,这意味着任何人都可以读取或销毁任何数据。请阅读:[如何防止PHP中的SQL注入?](http://stackoverflow.com/q/60174/660921)您也不想使用'md5()'进行密码散列,因为它的* *不安全,可以非常容易地被黑客入侵。改用'crypt()'。另外,'mysql'扩展在PHP 7中已被弃用和删除。使用'mysqli'或PDO。 – Carpetsmoker

回答

0

此代码:

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行如果

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简化您的查询匹配,因此用户已经通过身份验证,否则会返回0。使用mysql_fetch_assoc然后比较结果是多余的。

if($NumRows)将返回1如果一排火柴,1true

更新:

这是最有可能是由于你的数据库太短成功插入整个md5()散列字段的长度。因此,后一部分没有成功插入。

重要:

你不应该使用MySQL,因为它已经过时,用MySQLi代替。 MySQL功能在PHP 7中不可用。

另外,您需要使用mysql_real_escape_string来防止MySQL注入。

md5()不是一种非常安全的存储密码的方式,而是使用crypt()

+0

谢谢你的所有。当我正式启动网站时,我会牢记这一点。现在,我只是想让这个旧脚本正常工作。即使在所有这些之后,我仍然得到相同的错误。任何其他想法? –

+0

@Cyber​​izedNinja诊断问题的快速方法是回显'$ name'和'$ pass'并手动将它与数据库中的记录进行比较 – Panda

+0

我为我的问题添加了2个截图。其中一个用户名为bob,用户名= Bobby,密码= Password作为md5哈希。回声结果并不完全匹配,因为它有额外的垃圾添加。 –