注冊SESSION變量:
PHP5使用$_SESSION[‘xxx’]=xxx注冊SESSION全局變量。和GET,POST,COOKIE的使用方法相似。
注意:session_reGISter(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle設為on,不過出于安全考慮,強烈建議關閉register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建議用$_SESSION代替之。例如:
Page1.php
<?php Session_start(); //使用SESSION前必須調用該函數。 $_SESSION[‘name’]=”我是黑旋風李逵!”; //注冊一個SESSION變量 $_SESSION[‘passwd’]=”mynameislikui”; $_SESSION[‘time’]=time(); echo '<br /><a href="page2.php">通過COOKIE傳遞SESSION</a>'; //如果客戶端支持cookie,可通過該鏈接傳遞session到下一頁。 echo '<br /><a href="page2.php?' . SID . '">通過URL傳遞SESSION</a>';//客戶端不支持cookie時,使用該辦法傳遞session. ?> |
<?php session_start(); echo $_SESSION['name']; // echo $_SESSION['passwd']; // echo date('Y m d H:i:s', $_SESSION['time']); echo '<br /><a href="page1.php">返回山一頁</a>'; ?> |
<?php session_start(); $old_sessionid = session_id(); session_regenerate_id(); $new_sessionid = session_id(); echo "原始 SessionID: $old_sessionid<br />"; echo "新的 SessionID: $new_sessionid<br />"; echo"<pre>"; print_r($_SESSION); echo"</pre>"; ?> |
<?php $previous_name = session_name("WebsiteID"); echo "新的session名為: $previous_name<br />"; ?> |
<?php // 初始化session. session_start(); /*** 刪除所有的session變量..也可用unset($_SESSION[xxx])逐個刪除。****/ $_SESSION = array(); /***刪除sessin id.由于session默認是基于cookie的,所以使用setcookie刪除包含session id的cookie.***/ if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // 最后徹底銷毀session. session_destroy(); ?> |
由此我們可以得出刪除Session的步驟:
?、賡ession_start()
?、?_SESSION=array()/unset($_SESSION['xxx'])
?、踫ession_destroy()
● SESSION安全:
會話模塊不能保證存放在會話中的信息只能被創建該會話的用戶看到。根據其存放的數據,還需要采取更多措施來主動保護會話的完整性。
評估會話中攜帶的數據并實施附加保護措施通常要付出代價,降低用戶的方便程度。例如,如果要保護用戶免于受簡單的社交策略侵害(注:指在 URL 中顯示的會話 ID 會被別人在電腦屏幕上看到,或被別的網站通過 HTTP Referer 得到等),則應該啟用 session.use_only_cookies。此情形下,客戶端必須無條件啟用 cookie,否則會話就不工作。
有幾種途徑會將現有的會話 ID 泄露給第三方。泄露出的會話 ID 使第三方能夠訪問所有與指定 ID 相關聯的資源。第一,URL 攜帶會話 ID。如果連接到外部站點,包含有會話 ID 的 URL 可能會被存在外部站點的 Referer 日志中。第二,較主動的攻擊者可能會偵聽網段的數據包。如果未加密,會話 ID 會以明文方式在網絡中流過。對此的解決方式是在服務器上實施 SSL 并強制用戶使用。
默認情況下,所有與特定會話相關的數據都被存儲在由 INI 選項 session.save_path 指定的目錄下的一個文件中。對每個會話會建立一個文件(不論是否有數據與該會話相關)。這是由于每打開一個會話即建立一個文件,不論是否有數據寫入到該文件中。注意由于和文件系統協同工作的限制,此行為有個副作用,有可能造成用戶定制的會話處理器(例如用數據庫)丟失了未存儲數據的會話。
上面介紹函數下文將會用到,但還有一些有關session的函數也介紹一下:
session_encode
函數功能:sesssion信息編碼
函數原型: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
函數功能:sesssion信息解碼
函數原型:boolean session_decode (string data)
返回值:布爾值
功能說明:這個函數可將session信息解碼,成功則返回邏輯值true
Php5不再使用session_id,而是把它變成一個常量SID,并保存在cookie中。如果客戶端禁用了cookie,php會自動通過url自動傳動傳遞SID,其條件是設置php.ini中的session.use_trans_sid = 1。此時即使客戶端即使禁用了cookie也沒關系了。
用 strip_tags() 來輸出 SID 以避免 XSS 相關的攻擊。