3 回答

TA貢獻1801條經驗 獲得超16個贊
術語“會話”被重載以表示服務器上和瀏覽器中的不同內容。瀏覽器會話最多只能與服務器會話緊密連接?!皶捊俪帧笔侵阜掌鲿?。
在服務器端,會話具有ID(在客戶端和服務器之間傳遞),內容(存儲在服務器上)和可能的其他屬性(例如上次訪問時間)。會話ID通常以cookie的形式傳遞。在PHP中,cookie的默認名稱是“ PHPSESSID”。如果沒有cookie,PHP將(可選)使用同名的查詢字符串參數(“ PHPSESSID”)。此cookie(或查詢參數)可以輕松更改,因此會話標識符也可以更改。
會話的內容(即包含用戶的登錄狀態)不能由客戶端更改,數據存儲在服務器上,只能由該服務器上的PHP腳本更改。請注意,在共享主機環境(由其他服務或用戶共享)中,如果使用默認會話存儲目錄(/tmp),則可以覆蓋會話。為了防止這種情況,要么使用數據庫,要么使用具有適當目錄權限session_set_save_handler()集的自定義會話目錄session.save_path(最好設置為700,這意味著只有所有者(PHP用戶)才能對其進行讀寫)。
為了防止會話劫持,您必須具有其他方法可以根據會話識別用戶。這可以是用戶代理,IP地址或其他cookie。前面提到的方法只是解決方法,如果涉及到會話,則最好使用HTTPS來防止會話cookie的竊取。不要忘記將httponly標志設置為true使用session_set_cookie_params()
在客戶端,“會話”再次超載并在各種上下文中使用(例如,會話管理器,當打開瀏覽器時會恢復打開的頁面,會話cookie和sessionStorage)。我們可以說瀏覽器會話由視圖及其相關數據的集合組成,以嘗試將這些含義組合在一起(絕不是標準的含義)。(通過“視圖”,我指的是帶標簽的瀏覽器中的選項卡,而非帶標簽的瀏覽器中的窗口; DOM window對象將視圖公開給JS。)每個視圖都有一個歷史記錄,一個當前頁面和頁面數據。會話中的視圖之間共享同一域中頁面的頁面數據;如果兩個頁面位于不同的域或不同的會話中,則它們不共享數據。退出瀏覽器會關閉所有打開的會話,可能會保存部分會話(例如歷史記錄,當前頁面,sessionStorage),以便會話管理器可以重新打開它們。會話cookie是在會話關閉時被丟棄的cookie。換句話說,會話cookie是非持久性的。盡管會話cookie可以保存會話ID,但是這兩個概念是正交的(意義4;會話cookie可以保存會話ID以外的內容,并且可以將會話ID存儲在持久性cookie中)。
同一集合中是否有兩個不同的視圖取決于瀏覽器。例如,一個瀏覽器可能認為一個會話由一個窗口中的所有選項卡組成;單獨的窗口是單獨的會話。IE8允許用戶通過“新會話”菜單項創建新會話。否則,將在同一會話中打開新的窗口和選項卡。隱私模式還會創建新的會話。
總而言之,瀏覽器會話確實是由瀏覽器設置的,盡管它為用戶提供了多種控制瀏覽器會話的方式:創建新會話,通過瀏覽,保存和還原會話來更改視圖中的歷史記錄和當前頁面。用戶甚至可以通過編輯保存在磁盤上的會話來更改會話數據,盡管這不是瀏覽器提供的功能。這些都與會話劫持無關。服務器會話是由服務器創建和管理的,但是用戶可以(嘗試)通過更改其瀏覽器傳回服務器的會話ID來切換服務器會話,這是會話劫持的基礎。
- 3 回答
- 0 關注
- 442 瀏覽
添加回答
舉報