2016-03-13 149 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哈希。回聲結果並不完全匹配,因爲它有額外的垃圾添加。 –