2011-09-01 49 views
0

我想要做的是:當用戶在index.html頁面的表單中輸入用戶名和密碼時,如果它們與DB中的內容匹配,發送到下一頁; userlogin.php。 如果他們的用戶名或密碼不正確,則會要求他們在index.html頁面上重新輸入他們的詳細信息,並在表格文本框上方顯示「您的用戶名不正確」或「您的密碼不正確」等錯誤。如果需要,我可以粘貼此代碼。在php中用戶名和密碼驗證mysql

我是否也可以將此文字字體顏色改爲紅色?

這是我目前擁有的userlogin.php頁面

<?php 
mysql_connect("Server", "root", "Gen") or die("Couldn't select database."); 
mysql_select_db("generator") or die("Couldn't select database."); 

$username = $_POST['username']; 
$password = $_POST['password']; 

$sql = "SELECT * FROM users WHERE Username = '$username' AND Password = '$password' "; 
$result = mysql_query($sql) or die(mysql_error()); 
$numrows = mysql_num_rows($result); 
if($numrows > 0) 
    { 
    echo 'Your in'; 
    } 
else 
    { 
    echo 'Your not in'; 
    } 
    ?> 
+11

讓我們希望小鮑比表不註冊。 – Rijk

+3

請閱讀有關sql注入http://php.net/manual/en/security.database.sql-injection.php – corretge

+0

笑話,你應該瞭解[SQL注入](http://en.wikipedia.org/wiki/SQL_injection#Technical_Implementations)和[如何避免它](http://en.wikipedia.org/wiki/SQL_injection#Mitigation) – Zecc

回答

2

首先的代碼,你的代碼很容易受到SQL注入。使用PDO和prepared statements來解決這個問題。其次,你顯得不加密地存儲用戶名。這是非常不安全的。使用hashing function加密密碼,並在運行查詢以獲得匹配之前加密提交的密碼。着色輸出很簡單:

echo '<span style="color:red">Your not in</span>'; 

並使用sessions實際登錄用戶成功後詢問用戶表的用戶名/密碼組合,存儲在$_SESSION變量返回的USER_ID。在每個需要保護的頁面上,檢查是否存在$_SESSION['user_id'];如果它不在那裏,您的用戶需要登錄才能重定向到登錄表單。

這應該做左右雅的伎倆;)

+0

使用簡單的user_id作爲會話密鑰是一個明顯的失敗,它是一個可預測的整數,通常以1,2,3的順序運行。您需要創建一個唯一且隨機的session_id。我會建議使用:'$ session = hash('sha512','username'。$ currentdate。$ currenttime);'這將爲每個會話生成一個唯一的session_id,連接被猜到。 – Johan

+0

那麼,我不是建議使用user_id作爲會話ID ...我說將user_id存儲在會話中。由PHP生成的session_id很好。 – Rijk

12

有作爲的sooo很多事情錯這個代碼:

1 - 你有一個SQL注入漏洞。

如果我輸入' or 1=1 LIMIT 1 --作爲用戶名,我將永遠訪問,無論如何。
將您的代碼更改爲。

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

參見:How does the SQL injection from the "Bobby Tables" XKCD comic work?

2 - 你是在明確
存儲密碼這是一個巨大的,不,不。結合SQL注入漏洞,黑客需要5分鐘才能獲取您網站上所有用戶名和密碼的列表。

將密碼存儲爲鹽味散列。

我喜歡使用用戶名作爲鹽。

您使用存儲的密碼哈希:

INSERT INTO users (username, passhash) 
VALUES ('$username', SHA2(CONCAT('$password','$username'),512)) 

你使用測試用戶憑據:

SELECT * FROM users 
WHERE username = '$username' AND 
passhash = SHA2(CONCAT('$password','$username'),512) 

參見:Secure hash and salt for PHP passwords
人和:What is "salt" when relating to MYSQL sha1?

BTW,使用SHA2與512密鑰長度,SHA1不再安全,並且MD5更加破碎。

3-登錄永遠只能滿足對1個用戶
此代碼:

if($numrows > 0) 

是沒有意義的,如果你得到2行從數據庫中,這是一個明顯的跡象有人砍死你的系統。測試應該是:

if($numrows > 1) { //send email to sysadmin that my site has been hacked } 
else if ($numrows = 0) { echo "wrong username or password" } 
else { echo "welcome dr. Falken" } 

4-如果有錯誤不要死,叫例行重啓連接或東西

此代碼:

$result = mysql_query($sql) or die(mysql_error());  

是罰款在測試中,但在生產中你應該做一些類似於

$result = mysql_query($sql); 
if ($result) { 
    //do the deed 
} else { 
    //call error recovery routine 
} 

錯誤恢復例程應重新連接到服務器,並在日誌中記錄錯誤。錯誤是不能修復的,它應該發送一封電子郵件到系統管理員,然後死掉服務器。

+0

一個側面的問題,這有多安全:foreach($ _GET as $ id => $ val) $ _GET [$ id] = mysql_real_escape_string($ val); –

+0

@Bojan,在代碼中使用$ _GET沒有問題,將$ _GET插入SQL或HTML字符串時只有一個問題。在第一種情況下,您需要擔心SQL注入,後者您需要擔心XSS。這兩個問題在SO上進行了廣泛的討論,只需在stackoverflow上搜索'[php] [xss]'或'[php] [mysql] SQL注入「即可。 – Johan

+0

那麼我是由一個朋友給他,他說這應該保持安全(與POST一起),但我懷疑。我知道關於sql注入問題,我曾經做過的網站被黑客攻擊的方式..忘了過濾一個輸入 –