PHP的Session機制

  客戶端瀏覽器和服務器之間通訊使用的http協議是一種無狀態的協議,在它看來,客戶端發起的每一個請求都是獨立、沒有關聯的。然而,在實際的Web應用開發中,服務器卻常常須要根據用戶以往的一些狀態或數據對請求作出相應的應答,因此須要記錄用戶的某些狀態或數據。Session就是用於保持客戶端請求和服務器應答之間的上下文聯繫,本文主要介紹PHPSession機制。php

  PHPSession機制的工做過程大體是這樣子的:當客戶端瀏覽器向服務器發起一個請求的時候,服務器會檢查請求數據包頭部中的「Cookie」字段是否包含名稱爲session.name的變量(session.namePHP的配置文件php.ini中的一個配置項,用於配置服務器使用的session的名稱,默認爲「PHPSESSID」),該變量的值即爲sessionid,即:$_COOKIE[session.name]=sessionid。若不存在,PHP會在session.save_path配置的路徑目錄下生成一個文件(session.save_path也是PHP的配置文件php.ini中的一個配置項,配置服務器session文件放置的位置),同時生成一個sessionid,這個文件的名稱即爲「sess_」和sessionid拼湊而成。而後在發送給瀏覽器的數據包頭部中的Set-Cookie字段中指定session的名稱和對應的sessionid,瀏覽器則根據該字段的信息在內存中建立一個Cookie,嚴格來講叫SessionCookie。下一次瀏覽器再訪問服務器的時候便會在數據包頭部的Cookie字段中加入該Cookie。若服務器發現瀏覽器請求包頭部中「Cookie」字段包含了名爲session.namesessionid,就會根據該sessionidsession.save_path指定的路徑下找到名稱爲「sess_+sessionid的文件,對文件進行讀取或寫入操做,開始了和客戶端之間的會話。數據庫

  因爲SessionCookie是存在於瀏覽器內存中的,因此當瀏覽器關閉的時候,原來的SessionCookie也就消失了,下一次訪問同一個服務器須要再次建立session文件和Cookie,固然也有一些cookie是存儲在客戶端硬盤中的,即便關閉了瀏覽器,下一次打開瀏覽器訪問相同網站的時候仍是可使用這個cookie。當客戶端的cookie過時以後,服務器中原來的session文件也就沒有用處了。在PHP的配置文件php.ini中,使用配置項「session.gc_maxlifetime」來設置session文件的生存期,超過這個時間期限的文件數據都將被視爲垃圾,並由垃圾回收程序處理。垃圾回收程序是在會話初始化時啓動的,但並非每一次都會啓動,是有必定機率的,PHP配置文件中使用「session.gc_probability」和「session.gc_divisor」這兩個配置項來設置這個機率,計算公式爲:session.gc_probability / session.gc_divisor瀏覽器

  以上講述的是使用Cookie來存儲sessionid的方法,這也是PHP默認的存儲sessionid的方法。當客戶端的Cookie出現問題的時候,如:用戶設置瀏覽器禁用cookiesession就會受到影響了。不過咱們能夠經過其餘方法來存儲sessionid,主要有如下三種方法:安全

1. 設置文件php.ini中的session.use_trans_sid = 1,可讓PHP自動跨頁傳遞sessionidPHP會自動把sessionid附着在URL末尾)。服務器

2. 手動經過URL傳值,或經過隱藏表單字段傳遞sessionidcookie

3. 使用文件、數據庫等形式保存sessionid,在跨頁過程當中手動調用。session

  注意,方法一配置session.use_trans_sid=1的同時也要配置session.use_only_cookies=0,不然客戶端禁用了Cookie以後即便置session.use_trans_sid=1session仍是沒法使用。函數

  在方法二中,第一次調用session_start()函數時,PHP會建立一個session文件併產生一個sessionid,能夠經過session_id()函數得到該sessionid,將sessionid拼接在url後面經過get方法傳遞(這種方法是存在很大的安全問題的),或者將sessionid做爲表單的隱藏字段使用post方法傳遞,而後在下一個頁面中能夠把傳過來的sessionid做爲參數傳遞給PHPsession_id()函數,指定要讀寫的session文件,而後調用session_start()函數啓動session會話,接下來就能夠對session文件進行讀取操做了。post

  必須說明的是,PHPSession機制並非絕對安全的,攻擊者若是能經過必定手段劫持、或者猜想出某個合法用戶的sessionid,那麼屬於這個用戶的session數據都將暴露。因此,開發者應該設計一些方案來防護攻擊者的攻擊,提升Session機制的安全性,下面提供了一種利用請求數據包頭部中的一些字段信息來增強Session安全性的方案思路。網站

  將頭部字段「User-Agent」和sessionid組合起來加密生成一個token,而且讓客戶端在後續的請求中攜帶這個token。爲了更加保險,可以使用兩種不一樣的數據傳遞方式來 分別傳遞sessionidtoken,例如,經過cookie傳遞sessionid,經過get方式傳遞token

相關文章
相關標籤/搜索