2011-09-28 93 views
0

這個問題有更多的關於我如何設置我的服務器端代碼爲一個簡單的登錄腳本。我對實現我的目標的最佳方式感興趣,當然這是爲了針對數據庫驗證用戶用戶名和密碼,並向他們提供成功的登錄名,註冊頁面或找到的用戶名或密碼,但替代方案是錯的。登錄服務器端邏輯

現在,我把它建立在我的sql查詢掃描數據庫的用戶和傳遞:

SELECT * FROM test WHERE userName='" + userName + "' AND pass='" + password + "'" 

問題的這種做法,要麼返回一個true或false ......我不能告訴其中一個輸入是否正確,另一個不正確。它要麼找到記錄,要麼沒有。

因此,我可以基於用戶名進行查詢,如果發現,請在將用戶傳遞給成功登錄之前檢查記錄是否有正確的密碼。這樣我知道密碼是否是錯誤的,但我不知道密碼是否正確,用戶只是輸入錯誤的用戶名。

另外,我可以擴展,如果沒有找到用戶,請根據密碼重新查詢數據庫,並確定是否可以找到記錄但用戶名不匹配。這似乎與數據庫來回很多,這很好。但我想聽取一些專家的意見,看這是否是一種正確的方法。

+1

我沒有看到單獨的查詢密碼的地步。不應該阻止多個用戶選擇相同的密碼。從安全的角度來看,您永遠不會希望向用戶反饋說「該密碼已被使用」。 –

+1

在處理登錄失敗時提供太多信息通常被認爲是不好的做法 - 它爲黑客提供了可用來滲透系統的信息。 查看hotmail或google郵件上的用戶流量,瞭解目前可接受的方式。告訴黑客,他們得到了正確的用戶名,但錯誤的密碼告訴他們繼續嘗試不同的密碼;告訴他們他們有一個有效的密碼,但沒有正確的用戶名允許他們測試普通密碼(神,性別和密碼,根據民間傳說)的存在..) –

+0

有道理。這是我正在尋找的反饋。謝謝。根據您的反饋意見,我目前正在採取這種方式,採用適當的方法? – ryandlf

回答

0

你不想太多的信息透露給人們不好的意圖試圖探測你的系統可用的用戶名(甚至是 - 上帝保佑 - 正在使用的密碼)。

當登錄嘗試失敗,簡單地顯示一個消息,指出:

用戶名和/或口令不匹配。

另外,在使用數據庫時,請使用prepared statements,而不是字符串連接;它可以保護您免受SQL注入攻擊。 Plus - 儘管從代碼片段中不完全清楚 - 不要存儲普通密碼或純密碼哈希值。依靠許多可用且經過良好測試的加密/哈希庫中的一個PHP's crypt function(確保你選擇了合適的散列函數,如SHA512)。然後

您以最簡單的形式代碼應該是這樣的:

// coming from your login page 
$dbh = new PDO(…); 
$sth = $dbh->prepare('SELECT `digest` FROM `users` WHERE `name` = :name LIMIT 1'); 
$sth->prepare(array(':name' => $_POST['username'])); 
$result = $sth->fetch(); 

if($result !== FALSE && crypt($_POST['password'], $result['digest']) === $result['digest']) { 
    printf('You logged in successfully as %s', htmlspecialchars($_POST['username'])); 
} else { 
    echo 'Sorry, username and/or password did not match! Please try again.'; 
    sleep(1); 
    exit; 
} 
1

我沒有太多的想法,我的sql或不支持存儲過程。如果支持,那麼你可以用這種方法讓SP檢查所有的情況。下面是MSSQL的代碼,你可以用我的SQL檢查:

IF EXISTS(SELECT [id] FROM [dbo].[users] WHERE [user_name] = @user_name AND [password] = @password) 
BEGIN 
    SELECT 1 AS RETURNVAL --Valid User   
END 
ELSE IF NOT EXISTS(SELECT [id] FROM [dbo].[users] WHERE [user_name] = @user_name) 
BEGIN 
    SELECT 0 AS RETURNVAL -- User doesn't exist 
END 
ELSE 
BEGIN 
    SELECT -1 AS RETURNVAL -- Password Not Correct 
END 
+0

我正在使用mysql,最後我知道,存儲過程不被支持,但可能已經改變了。我得看看它。編輯:它看起來像存儲過程是支持的,所以我會給你的查詢一試。 – ryandlf

+0

如果2個用戶擁有相同的密碼,該怎麼辦?在MySQL主題上 - 存儲過程,函數,視圖,觸發器等等很久以前都被支持。 –

+0

@ N.B。 :2個用戶具有相同的密碼,但用戶名不相同。在我的查詢中,我在第一種情況下檢查了用戶名和密碼。 –