2012-02-14 80 views
2

我已創建此php登錄腳本。我想知道天氣是否安全,如果沒有,我該如何改進它。如何使此登錄系統更安全

PHP腳本

<?php 
include_once ("ConnectToMySql.php"); 

session_start(); 

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

$query = "SELECT password FROM users WHERE username = '$username';"; 
$result = mysql_query($query); 

if(mysql_num_rows($result) < 1) 
{ 
    echo "This Username Is Not Registered!"; 
exit; 
} 
if(mysql_num_rows($result) == 1) 
{ 
if ($password == $result) 
{ 
    echo "Logged In!"; 
} 

else echo "Wrong Password!"; 
} 
?> 

感謝

+1

谷歌搜索「php安全登錄表單」帶回了豐富的好帖子,如http://tinsology.net/2009/06/creating-a-secure-login-system-the-right-way/ – Joe 2012-02-14 11:09:44

+0

也對空值應用服務器端驗證,以便數據庫查詢更安全 – 2012-02-14 11:18:42

回答

4

第一個提示可以顯示一個常見的錯誤兩種無效的登錄情況:invalid username or password。這樣,最終的攻擊者不知道用戶名是否有效。

您還可以製作一個匹配用戶名和密碼的單個查詢。您可能需要更多的用戶信息(要存儲在會話中?),因此選擇這些字段而不是密碼是一個好主意(例如,id,name)。

關於存儲在數據庫中的散列密碼,您可以添加SALT以提高安全性。 http://en.wikipedia.org/wiki/Salt_%28cryptography%29

+1

是的,您應該爲每個用戶添加一個獨特的salt值。您也可以考慮在*客戶端*側進行散列,以確保密碼不會通過網絡發送(除非您已經使用SSL/TLS)。 – adelphus 2012-02-14 11:21:36

+0

您的意見是一個巨大的幫助。非常感謝你! – alexjfno1 2012-02-14 12:13:08

+0

我很高興他們有幫助:) – 2012-02-14 12:17:07

1

我會做什麼是查詢更改爲以下:

"SELECT COUNT(*) FROM users WHERE username = '$username' AND password='$password';" 

這樣的話,你就不必檢查,如果密碼是繼正確的(和你沒有通過敏感數據),您只需檢查返回的行數是否等於1,並且您可以爲用戶名/密碼生成單個錯誤消息。