2010-10-20 88 views
0

尋找一個php登錄腳本。我搜索了stackoverflow,並看到了很多帖子,但任何人都可以推薦最好的方法嗎?另外,如果我想使用哈希,如何在檢索時解碼密碼?我的iPhone應用程序使用相同的數據庫,並且當前密碼以正常文本存儲(我知道不太安全)。PHP登錄腳本(安全但不像銀行金庫)

另外,如果我實現了一個重定向到info.php的登錄頁面,如何阻止用戶直接進入info.php頁面而不登錄會話控制?

期待聽到您的意見。非常感謝。

+0

THA NKS給大家的答覆。這很棒! – BigMike 2010-10-20 05:02:22

回答

3

This is a great tutorial登錄系統設計。它以面向對象的方式覆蓋所有主要主題,對於瞭解不同的考慮因素非常有用。

可解碼的密碼並不像它們可能的那樣安全,但我有客戶堅持他們能夠隨意檢索和更改密碼,沒有例外。所以在某些情況下,我選擇使用base64編碼的字符串來存儲在數據庫中,這似乎工作得很好。存在用於管理用戶需要的編碼/解碼功能。

的確,會話控制(和/或cookie)是控制訪問的方法。使用面向對象的模式構建它將允許您僅使用每頁代碼的一行或兩行代碼(或者如果常見,則在代碼行中包含一行代碼)。

我的一個警告是考慮你是否有一個共同的登錄級別或需要用戶級別的權限。在構建基於權限的登錄非常重要的站點之後,確定更多的工作。如果沒有計劃在一開始就會變成真正的怪物。

+1

鏈接的例子是**不安全**。密碼散列包含缺陷,並且該示例易受SQL注入攻擊的影響,因此是額外的好處。 – Jacco 2012-05-16 12:24:39

+0

@jacco,OP沒有詢問關於SQL注入的問題,他們正在尋找具有可解密密碼的登錄腳本示例。毫無疑問,專業開發人員不會跳過數據衛生等基本安全措施,而使用公共免費教程來保護您的關鍵任務網站是愚蠢的。 – bpeterson76 2012-05-16 14:39:14

+0

就我讀的問題而言,他想要做哈希,並且不知道這個主題。總之,你永遠不應該推薦任何不安全的代碼。對於安全相關的例子來說更是如此。這個例子顯示了更多不安全的做法。換句話說,這不是一個好例子,它促進了不安全的做法,根本不應該遵循。 – Jacco 2012-05-17 09:53:25

3

POST到HTTPS URL。

你永遠不會解碼哈希密碼。丟失的密碼需要另一種機制來處理。

是的,會話控制。登錄時在會話中設置一個標誌,並在其他頁面上檢查它。

2

您不需要解碼密碼,您將不得不將密碼存儲在數據庫中,並且當用戶嘗試登錄時,會將存儲的密碼與輸入的密碼的哈希進行比較。

關於info.php,是的,如果登錄成功,您在會話中分配一個變量,並測試用戶是否已登錄,您只需測試該變量是否已分配。

2

基本上你會散列你的密碼,所以它不能被檢索用於惡意目的,散列存儲在數據庫而不是明文密碼,你只能比較2個散列值。

您的客戶端可以存儲密碼,因爲他們想要的,但Web應用程序應該在每一步控制會話有效期(存儲一些登錄標識與適當的到期或類似的東西會話變量), 所以基本上你require("session_control.inc")在每個「受保護」頁面中,您可以檢查會話有效性。

最好的方法是使用一個MVC框架,它可以幫助定義這種情況下的邏輯。

0

您可以使用密碼散列但也有PHP的crypt()函數http://php.net/manual/en/function.crypt.php

他們基本上做同樣的事情,但墓穴是一個小整潔IMO。請確保你也可以得到一個很好的鹽生成腳本,所以當你在數據庫中保存的密碼,這裏是我的密碼加密功能,

function crypt_password($password) 
{ 
    if($password){ 
     //blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 base 64 
     $blowfish = '$2a$10$'; 

     //get the random bytes and makes a salt 
     $salt = $this->get_salt(); 

     //append salt2 data to the password, and crypt using salt, results in a 60 char output 
     $crypt_pass = crypt($password,$blowfish . $salt); 

     //blowfish comes out as 60, check 
     $len = strlen($crypt_pass); 

     if($len == 60) 
     { 
      return $crypt_pass; 
     } 
     else { 
      throw new Exception('encryption failed'); 
      return false; 
     } 
    } 
    else { 
     throw new Exception('encryption failed, missing password'); 
     return false; 
    } 
} 

,然後當你要注意,這不是無鹽功能安全驗證這個密碼,您只需查詢登錄電子郵件或用戶ID的數據庫,然後以驗證它的那樣簡單

if (crypt($input_pass, $stored_pass) == $stored_pass) { 
    return true; 
} 
+0

在上面的例子中你的$是什麼? – 2011-01-15 07:14:28

+0

@james一個函數,生成一個隨機鹽它的修改http://www.openwall.com/phpass/ – Brian 2011-02-06 03:15:18

3

仍處於開發階段,但安全,快速,乾淨,好了最新:

[最新版本] https://github.com/Panique/PHP-Login

[老版本的網站] http://www.php-login.net

我與一些設計師&編碼器幫助創造了這個。已經在幾個論壇上進行了討論,並得到了非常積極的回覆。所有當前的問題都可以在github問題頁面上看到。所有的代碼都是公開的,免費的和可以上架的

+1

+1共享登錄腳本,也許它仍然更新:p – bungdito 2013-06-20 21:59:19

4

我的答案遲了一點,但我會發帖無論如何,我知道這並不直接回答這個問題,但它是相關的不少。這裏有幾點關於登錄安全。

記住

你是最好的老調重彈哈希密碼,並儲存在用於自動登錄的用戶cookie中的翻版。當你的老調重彈密碼,使用特定的東西到瀏覽器作爲種子,如瀏覽器類型。這將有助於防止cookie被盜(通過人們窺探網絡流量)。這有助於防止使用彩虹桌的機會。

會議

注意會話劫持的:http://en.wikipedia.org/wiki/Session_hijacking

CSRF

跨站請求僞造 - 實現你登錄後的事,但要注意的,因爲它不僅影響記錄成員:http://en.wikipedia.org/wiki/Cross-site_request_forgery

HTT PS

應該在登錄請求發送到的頁面上使用HTTPS - 它不一定要在您輸入登錄信息的頁面上!

散列

您可以哈希密碼,客戶端使用JavaScript這隻會服務器來保護成員具有在不使用HTTPS時transfering他們在網絡上自己的密碼被盜。這很好,因爲很多人經常在許多網站上使用相同的密碼。缺點是:你不能檢查服務器端的密碼長度&如果javascript被禁用,他們不能登錄(儘管你可以在某種程度上編程)。雅虎過去幾年前(可能還會這樣做)。

當您在服務器上收到密碼時,它通常使用種子進行重新映射並存儲在數據庫中。這更安全,因爲即使人們知道哈希,他們仍然無法登錄!只有原始密碼會重新散佈到同一個散列,讓用戶登錄。

鍵盤記錄器

如果你想避開鍵盤記錄器(或大部分),你可以通過添加一個JavaScript鍵盤/鍵盤這樣做。然後,用戶單擊字母和數字以使用鼠標代替鍵盤輸入其密碼,這意味着鍵盤記錄器難以記錄密碼。

知道的東西,有事,是值得

三個級別的安全性。有人知道的東西,比如密碼,某人的某個東西,比如電話(谷歌使用兩步驗證完成了前兩個),某人是指紋等。你填寫得越多,你的安全憑證就越多 - 通過一個很長的一步!

機器人

計算機有時會嘗試蠻力快速登錄頁面(一定要快,如果密碼是不正確的,劇本暫停甚至只需1秒,這大大降低了總的登錄嘗試一個機器人你可以暫停一個不正確的登錄1或2秒(就像linux一樣),或者你可以產生一個捕獲圖片,表明殭屍程序在X登錄失敗之後很難解決(像google一樣)

有要點,但我確定有其他要求。