在做網站中,PHP不能保證會話信息只能被會話者看到。根據其存放的數據,還需要采取更多措施來主動保護會話的完整性。當然這些做法會降低用戶的方便程度。
下面行為都會將會話ID泄露給第三方,使第三方能夠訪問所有與指定ID相關聯的資源。
?URL攜帶會話ID。如果連接到外部站點,包含有會話ID的URL可能會被存在外部站點的引用日志中。
?如果會話ID未加密,以明文方式在網絡中傳輸,就很容易被第三方監聽到。在默認情況下,所有與特定會話相關的數據都被存儲在由配置選項session.save_path指定的目錄下的一個文件中。對每個會話會建立一個文件。這是由于每打開一個會話即建立一個文件,不論是否有數據寫入到該文件中。為此用戶需要學習和使用會話加密方法,具體說明如下。
?session_encode:對Session信息進行編碼。
string session_encode(void);
該函數返回的字符串中包含全局變量中各變量的名稱與值,如a|s:12:"it is a test";c|s:4:"lala";。a是變量名,s:12代表變量a的值"it is a test"的長度是12,變量間用分號“;”分隔。
?session_decode:對Session信息進行解碼。boolean session_decode (string data)
該函數可對Session信息進行解碼,成功則返回邏輯值true。PHP 5不再使用session_id,而是把它變成一個常量SID,并保存在Cookie中。如果客戶端禁用了Cookie,PHP會自動通過URL自動傳動SID,其條件是設置php.ini中的ses-sion.use_trans_sid = 1。最后使用strip_tags()輸出SID,以避免XSS相關的攻擊。很多PHP開發人員喜歡使用Session會話變量,大量使用會話變量能夠幫助你設計更多人性化的功能。仔細分析原因:
?傳遞簡單。在Web應用程序內的頁面間傳遞一個變量值,使用Session變量要比通過查詢字符串傳遞變量值更簡單。
?使用方便。讀者可以在任何時候直接使用Session變量。
?更容易設計出針對不同用戶的設計體驗。Web設計的趨勢就是要以用戶體驗為中心,自然使用Session變量是最佳選擇。但是當初學者逐漸掌握Session的使用時,也應該注意幾個問題,避免在開發中亂用Session變量。
?Session過于依賴進程。Session狀態存儲在服務器的進程中。所以當inetinfo.exe進程崩潰時,Session會話信息就會全部丟失。
?Session過于依賴Cookie。用戶會話信息都存儲在Cookie中,如果客戶端完全禁用掉了Cookie功能,Session提供的功能也就自然失效了。
?Session作用域的局限性。用戶會話信息不能夠實現應用程序之間遷移。例如,百度網站的Web服務器可能不止一個,當用戶登錄其中一個頻道之后,可能需要去各個頻道中瀏覽,但是每個頻道都在不同的服務器上,如果想在這些Web服務器共享Session會話信息就是一個很麻煩的問題。
?任何變量和對象都會占用系統資源。Session變量同樣需要有單獨的運行時間和存儲空間。過多地使用Session變量就會導致大量代碼冗余,并且使服務器運行成本提高。
?當一個用戶訪問某個頁面時,每個Session變量的運行環境便自動生成,這些Session變量可能會在用戶離開該頁面后仍然保留,直到有效期過后。這必然構成對用戶安全的威脅。同時,如果在Session中存儲較大的對象(如ADO組件中的Recordsets、Connections對象等),當站點訪問量增大時,服務器將會因此而無法正常運行。 ?由于創建Session變量比較隨意,可隨時調用,不需要開發者去聲明,所以過度使用Session變量將會導致代碼閱讀性差,而且不好維護。鑒于PHP提供的Session變量存在很多局限性,使得PHP中Session成為了一個更加強大的功能。但是在PHP中,個人建議你要少用Session,只有在必要時選擇使用,以簡化Web開發。
當前文章標題:會話安全
當前URL:http://www.ccaudelo.com/news/wzzz/3276.html
上一篇:設置會話有效期
下一篇:認識Cookie