2011-10-12 54 views
0

出於某種原因,我的支票登錄腳本正在讓客人。檢查登錄腳本讓客人?

我還沒有使網站生活,所以它的一切都很好。

我檢查數據庫的用戶名和密碼,用戶放在html表單中,但由於某種原因,如果它甚至沒有得到結果,它仍然設置用戶名爲零 如果它得到結果它設置用戶名到用戶名,但如果它沒有得到任何結果,它將用戶名設置爲空。

我有一個if語句,但仍然設置它。

$myusername = mysql_real_escape_string($_POST['myusername']); 
$mypassword = mysql_real_escape_string($_POST['mypassword']); 


$sql  = "SELECT * FROM users WHERE username='$myusername'"; 
$result  = mysql_query($sql) or die(mysql_error()); 
$battle_get = mysql_fetch_array($result);  

if ($battle_get['password'] == $mypassword) 
{  
    $_SESSION['username'] = $myusername ; // store session data  
    header('Location: http://mydomainname.net/new_rpg/dashboard.php');  
} else { 
    echo "wrong password" ; 
} 
+1

** 1)**你爲什麼不保存密碼的哈希? ** 2。)**然後你將不必逃避密碼。 ** 3。)**爲什麼你不檢查MySQL端的密碼? ** 4。)**您是否清除了緩存以供測試? – ComFreek

+0

是的ive清除緩存,並在急於和我討厭md5製作變量md5很難找到。我不介意逃跑。我發現它是使腳本安全的一部分 –

+0

在散列它之後,您不需要再次輸入密碼。它將是十六進制字符串。此外,還有其他(更安全的)哈希算法可用(見['哈希()'](http://php.net/manual/function.hash.php)) – ComFreek

回答

0

Yur錯誤:

說我不是用戶。

因此$battle_get['password'] = false;

$mypasswordfalse

所以$battle_get['password']等於就可以解決這個$mypassword

雙向。

首先,SQL赤密碼:

$sql = "SELECT * FROM users WHERE username='$myusername' AND password = '$mypassword'";

if(!$battle_get) { 

echo "wrong password" ; 

} 
+0

** http://php.net/ faq.passwords ** – hakre

2

您不檢查用戶帳戶是否實際存在。您只是盲目地從結果集中獲取一行,即使該結果集中有記錄也不例外。這意味着$battle_get將是一個空數組(如果查詢失敗,則爲布爾值false)。然後您對提交的密碼進行字符串比較。如果該密碼也是空的,你做if (empty == empty)和咚......用戶在

你應該做的事情是:

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

$sql = "SELECT ... FROM users WHERE (username = '$username') AND (password = '$password')"; 
$result = mysql_query($sql) or die(mysql_error()); 

if (mysql_num_rows($sql) != 1) { 
    die("Invalid username and/or password"); // don't tell the user which failed. 
} 

檢查是如何返回多少行是至關重要的 - 如果沒有行被返回,則用戶不存在或密碼錯誤。如果返回1行,那麼它是有效的登錄名。如果返回多於1行,則數據庫中有重複的用戶名/密碼對,需要立即解決。

而剛剛看到你的「md5很難」評論如上:你錯了。 MD5非常簡單。

當您創建的用戶記錄,你可以很容易地散列密碼:

INSERT INTO users (password) VALUES (MD5('$password')); 

和登錄檢查:

SELECT ... WHERE (password = MD5('$password')); 

沒什麼它。

+0

mysql_real_escape_string非常方便,但參數化查詢是最佳選擇。看看這個帖子http://spotthevuln.com/2011/08/boundaries-sql-injection/另外Sha1是比md5更安全的散列,它的使用非常簡單:) sha1($ Password) – CountMurphy

+0

參數化查詢是所有這些都適用於他們所在的地方,但他們根本無法正常工作。 –

+0

如何?我從來沒有聽說過任何問題,我肯定會用它登錄頁面 – CountMurphy