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