2012-03-02 85 views
6

我正在考慮編寫自己的認證腳本,但我對安全性知之甚少。我應該在PHP中使用什麼用戶身份驗證?

從我讀過的文章看來,它通常涉及用salt對密碼進行散列並將其存儲在數據庫中。然後當用戶請求登錄時,密碼被散列並與數據庫進行比較。如果匹配,則用戶的數據存儲在$ _SESSION中。

但是,我不知道這是否安全。我讀了一些關於在數據庫中存儲會話密鑰的內容,但我不確定這是如何工作的,或者如何實現它。

有人可以解釋如何實施安全認證?

另外,是否有任何PHP身份驗證庫的建議我可以合併,很容易學習,而不是寫我自己的?

+2

請首先閱讀以下優秀摘要:[安全哈希和鹽的php密碼](http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) – 2012-03-02 08:00:49

+1

您應該重新 - 儘可能使用現有的認證框架,因爲它確實很複雜。例如,看一下https://github.com/delight-im/PHP-Auth,它既是框架不可知的,也是與數據庫無關的。 – caw 2016-10-21 21:04:20

回答

5

檢查this answer here

雖然答案是3歲,但建議的phpass庫是最新的。

此外,+1阿倫Cederholm。密碼安全性是一個廣泛的主題,您應該首先看看StackOverflow中已經討論過的相關問題,以便您更熟悉安全性的主題和最佳實踐。

雖然我喜歡框架(SymfonyZend等),因爲它們通常執行這些好的做法,只是用他們不會讓你一個優秀的程序員。你必須學習它的內在運作。我總是向一位編程他自己的安全認證機制的編程員致敬(只要他們沒有在真正需要強大安全性的實時站點中實現它),因爲這是學習和理解該主題內容的最佳方式。總是從現有的實現開始,然後用它作爲創建自己的代碼庫的例子。

+0

Zend實際上有一個可怕的Auth模塊,它帶有不安全的例子。 – Jacco 2012-11-29 14:31:18

5

事情要記住:

  1. 認證;驗證用戶是他們說他們是誰。
  2. 授權;確保用戶被允許做他們想做的事情。
  3. 會計;記錄和審覈他們的工作。

對於身份驗證,您需要跟蹤連接到(經常)與系統進行身份驗證的「用戶」。這需要知道一個標識符(用戶名,電子郵件或其他獨特的令牌)和密碼短語。將用戶名和密碼短語存儲在某個地方,但從不存儲密碼短語但不保護密碼:不要使用帶有鹽的消息摘要算法(如MD5或SHA1)。改爲使用bcrypt。儘管在這裏使用框架並不是一個壞主意,但不要總是依靠框架來做正確的事情。

對於授權,您需要跟蹤用戶正在執行的操作,並執行權限檢查以查看是否允許他們執行他們正在嘗試的操作。這可以通過多種不同的方式完成,並且所有這些都是特定領域的 - 你不會經常發現一個乾淨的例子,儘管你可以找到許多框架來幫助你。

對於會計,您需要記錄用戶所做的操作。這是任何應用程序中最經常被忽略的部分,但是當發生不好的事情時,從Web服務器訪問日誌中獲取並重建它是非常關鍵的知識,這是一場噩夢。同樣,這是特定領域的,但一個好的框架應該可以緩解它的實現。

最後,將所有這三者結合在一起就是您的用戶會話。當您在PHP中調用'session_start()'時,它會將會話標識符作爲cookie發送給客戶端,並將文件存儲到服務器的硬盤驅動器中,該文件包含該用戶的$_SESSION的內容。您還可以配置PHP以覆蓋默認功能並使用session_set_save_handler保存會話數據。然後,您可以將該信息存儲到數據庫。

TL; DR:使用像CodeIgniter,Drupal,Yii或其他一些積極開發的解決方案的框架。絕大多數框架可以完成你需要的任何東西,如果它們不這樣做,它們可以很容易地進行修改。 不要爲此創建自己的框架;使用一個已經可用的。

1

我使用tank_auth(一個Codeigniter插件),這很不錯。源代碼是如何實現安全登錄的很好參考。