2011-04-04 115 views
2

我決定爲我的應用程序處理身份驗證的最佳方式是從頭開始編寫我自己的會話處理程序。就像在外星人一樣,它是唯一能確保一件事情按照你想要的方式完成的方法。智能PHP會話處理/安全

這就是說,我談到我在充實最初的設計時遇到了一些障礙。我原本打算以混合方式使用PHP的會話處理程序,但我擔心與我的數據庫併發問題。這是我打算:

  1. 我做的第一件事是檢查IP地址(或者甚至可能會話)到蜜罐未經授權的嘗試。我寫了一些睡眠不佳的條件。這裏的大問題顯然在哪裏存儲我的黑名單以獲得最佳讀取速度。

  2. session_id生成,散列並存儲在$ _SESSION [myid]中。一個單獨的相同標記片段存儲在第二個$ _SESSION [mytoken]中。然後將相應的數據存儲在表X這是我不確定的位置(這是此問題的根源)。

  3. 然後,每個後續請求都會驗證[myid] & [mytoken]是我們所期望的,然後爲下一個請求重新發布新憑據。

  4. 根據會話的狀態,可以執行更明顯的ACL功能。

這是我的偏執會話處理程序的高層次概述。這裏是我真的堅持的問題:

一,什麼是存儲IP ACL的最佳方式?我應該寫信給hosts.deny嗎?我的方法有什麼性能問題嗎?

二,我的MitM預防方法看起來好嗎,還是比較多個索引時我太過分偏執?存儲這些信息的最佳方式是什麼,所以我不會碰到80-100個用戶的磚牆?

三,我是否在持續的會話重新生成和回寫中不必要地抨擊我的服務器?有沒有更好的辦法?

我最初爲小型應用程序編寫此代碼,但我更願意將它保留爲可與世界共享的可重用組件,所以我想確保儘可能使其可訪問且安全。

在此先感謝!

+0

我一直在考慮所有來自技術角度的人:純文本,mysql(擔心鎖定),NoSQL ala Mongo等等。我向所有的建議敞開! – VSack 2011-04-04 16:22:35

+0

如果每次請求重新發出下一個請求的新憑據,可能會破壞基於選項卡的導航。此外,還有一些公司有多個互聯網連接(冗餘,負載平衡),因此同一用戶的兩個請求可能來自兩個不同的IP地址。 – 2011-04-04 16:30:20

+0

我絕對考慮到多重IP問題,只對拒絕請求的IP進行完整性檢查,但是留下session_id的中間人檢查。 – VSack 2011-04-04 17:19:04

回答

1

寫入到hosts.deny中

雖然這是一個正常的主意,如果你想完全禁止IP從您的服務器的用戶,它只會用一臺服務器的工作。除非你在多臺服務器上安全傳播(噢,這聽起來已經很糟糕了),否則你將永遠停留在一臺服務器上。

您必須考慮有關使用主機的這些觀點。否認過:

  • 安全:爲重要的文件開放訪問的hosts.deny中在A Web服務器用戶
  • 疼痛:從不同的流程管理多次寫入(的DenyHosts例如)
  • 痛在A:安全作出賠償的文件,如果您想授予訪問先前在以後的日子
禁止的IP 10

我建議你簡單地禁止在你的應用程序的應用程序級別的IP地址。您甚至可以將禁止的IP地址存儲在中央數據庫中,以便它可以由多個子系統共享,並且仍然在應用程序級別執行。

+0

絕對同意hosts.deny的東西。好吧,那個部分是受傷的。我會在數據回購中做到這一點。 – VSack 2011-04-04 17:42:02

+1

+1,有一些代表;) – Phliplip 2011-06-16 07:00:41

0

I.存儲IP ACL的最佳方式是將禁止的IP推送到SQL數據庫,該數據庫不會遇到寫入文件等併發問題。然後,定期或觸發的外部腳本可能會生成IPTABLES規則。您不必在每次訪問時重新讀取數據庫,只有在檢測到錯誤行爲時才寫入數據庫。

二,如果您爲透明代理或移動設備背後的客戶提供服務 - IP更改,則在公共Internet上固定IP並不是一件好事。讓用戶選擇喜好,如果他們想要這個功能(取決於你的受衆,如果他們知道知識產權是什麼意思......)。我的解決方案是生成每個(頁面)請求的唯一令牌,在該頁面中重複使用AJAX請求(不要陷入資源問題 - 隨機數,會話數據存儲......)。我生成的令牌存儲在會話中並記住了幾分鐘。這讓我們用戶打開幾個選項卡,返回並在先前打開的選項卡中提交。我不綁定到IP。

三,這取決於...你沒有足夠的數據來回答。以上可能完全滿足您每天需要5分鐘到達您的站點的500個用戶的需求。或者它甚至可以適用於聊天網站/遊戲的一小時內1000個獨特的共享用戶 - 這取決於您的應用程序正在做什麼,以及如何緩存可以緩存的數據。

設計好,測試,基準。測試會話處理是否是您的資源問題,而不是別的。好的算法不應該讓你陷入資源問題。包括DoS防禦,它不應該是一個應用程序內代碼。應用程序可能會暗示DoS預防機制該做什麼,並讓專門工具進行防禦(請參閱答案I.)。

無論如何,如果您將來遇到資源問題,最好的出路是新硬件。對某人來說,這可能聽起來粗魯或者甚至不稱職,但是在6個月內計算新服務器的價格,實際上比工作價格高出30%:爲新服務器支付600美元,並且額外擁有130%的馬力,或者每月支付100美元提高5%(好吧,提高40%,但如果一週價值25美元可能會嚴重變化)。

如果您從頭開始設計,請先閱讀https://www.owasp.org/index.php/Session_Management,然後在Google上搜索會話劫持,會話修復和類似的字符串。