2013-06-03 168 views
0

我一直在尋找很長一段時間關於PHP的安全登錄。我發現了一些有趣的內容,但我仍然不完全肯定最安全和簡單的方法。用PHP安全登錄

我創建了一個簡單的系統,但我不確定它足夠安全。我將保留這個簡短的內容,以免讓你不知道詳細信息:

我在數據庫中的用戶表包含名爲「loginToken」的列。當用戶登錄時,將創建一個值(,基於該用戶的ID,一個隨機數,最後sha1被散列),該值插入到數據庫用戶表的loginToken中。

除此之外,$ _CCOKIE創建時具有相同的值。因此,這些值每次都是給每個用戶完全不同的,交替用戶登錄

我們檢查用戶登錄,我用這個下面的代碼:

$user_id = -1; //By default, the user is logged out 

if (isset($_SESSION["user"]) && isset($_COOKIE["ut"])) { //Check session and user token exists 
    //Get variables 
    $uid = $_SESSION["user"]; //Get user ID 
    $ut = $_COOKIE["ut"]; //Get user token 

    //Compare the user id with the user token in the database 
    $sql = mysql_query(" 
     SELECT COUNT(*) 
     FROM `users` 
     WHERE `id` = '$uid' AND `login_token` = '$ut' 
    "); 

    //Get result 
    $sql = mysql_result($sql, 0); 

    //Found! 
    if ($sql == 1) { 
     $user_id = $uid; //User logged in! 
    } 
} 

是這樣理解的?如果是這樣,那是一種足夠安全的方法嗎?

謝謝!

+1

這根本不安全。你不是在消毒你的信息,你信任客戶端的一切。請至少使用準備好的語句。 –

+1

你需要看看mysqli和參數化查詢http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php – j0hnstew

+1

@RudiVisser:對不起,我對這個編碼領域還比較陌生。什麼是「準備好的陳述」? – Tom

回答

0

您的方法不安全。用戶可以設置一個惡意cookie,可以在您的數據庫上執行SQL注入。

使用會話變量。

if ($_SESSION['logged_in'] === true) { ... 

這是經常使用的方法。

通常您希望用戶通過HTTPS安全表單輸入用戶名和密碼。當您收到請求時,將用戶名和存儲在數據庫中的密碼的散列版本與表單提供的散列版本進行比較。如果哈希匹配,則設置$ _SESSION ['logged_in'] = true。

在後面的代碼,檢查會話變量,以確保在用戶登錄

+1

謝謝,但我想你誤會了。我知道如何登錄,但腳本用於每個頁面的開頭,以檢查用戶當前登錄的任何地方。 編輯:而且由於會話只有持續有限的時間,我不能依賴會話。 – Tom

+1

會議可以實現永久持續。它們通過一個cookie來實現。您可以改變PHP對會話的處理方式,這對於爲會話數據使用基於SQL的後端更加安全且更具可擴展性是很常見的。 – beiller

+1

哦,我沒有意識到這一點。謝謝!用戶可以通過任何方式操作會話來以另一個用戶身份登錄嗎? – Tom

-1

使用以下命令來檢查HTML特殊字符和SQL注入防護:

$uname=trim(htmlspecialchars($_POST['username'])) 

,並檢查作爲

if($uname!=""){ 
//continue with your database connection and checking. 
//do use of prepare statement than using mysql_query() refer the link for  
//sample code. 
} 
else{ 
echo "UserName should not be null"; 
} 

下面是用PHP安全的鏈接進行登錄:http://www.codeslips.com/post/Login-script-in-PHP-data-checking-from-mysql-database