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