1.
什么是
session?
Session 的中文譯名叫做 “ 會話 ” ,其本來的含義是指有始有終的一系列動作 / 消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個 session 。目前社會上對 session 的理解非?;靵y:有時候我們可以看到這樣的話 “ 在一個瀏覽器會話期間, ...” ,這里的會話是指從一個瀏覽器窗口打開到關閉這個期間; 也可以看到 “ 用戶(客戶端)在一次會話期間 ” 這樣一句話,它可能指用戶的一系列動作(一般情況下是同某個具體目的相關的一系列動作,比如從登錄到選購商品到結賬登出這樣一個網上購物的過程;然而有時候也可能僅僅是指一次連接;其中的差別只能靠上下文來推斷了。
然而當 session 一詞與網絡協(xié)議相關聯(lián)時,它又往往隱含了 “ 面向連接 ” 和 / 或 “ 保持狀態(tài) ” 這樣兩個含義, “ 面向連接 ” 指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始。 “ 保持狀態(tài) ” 則是指通信的一方能夠把一系列的消息關聯(lián)起來,使得消息之間可以互相依賴,比如一個服務員能夠認出再次光臨的老顧客并且記得上次這個顧客還欠店里一塊錢。這一類的例子有 “ 一個 TCP session” 或者 “ 一個 POP3 session” 。
鑒于這種混亂已不可改變,要為 session 下個定義就很難有統(tǒng)一的標準。而在閱讀 session 相關資料時,我們也只有靠上下文來推斷理解了。不過我們可以這樣理解:例如我們打電話,從撥通的那一刻起到掛斷電話期間,因為電話一直保持著接通的狀態(tài), 所以把這種接通的狀態(tài)叫做 session 。它是訪客與整個網站交互過程中一直存在的公有變量,在客戶端不支持 COOKIE 的時候,為了保證數據正確、安全,就采用 SESSION 變量。訪問網站的來客會被分配一個唯一的標識符,即所謂的會話 ID 。它要么存放在客戶端的 cookie ,要么經由 URL 傳遞。
SESSION 的發(fā)明填補了 HTTP 協(xié)議的局限: HTTP 協(xié)議被認為是無狀態(tài)協(xié)議,無法得知用戶的瀏覽狀態(tài),當它在服務端完成響應之后,服務器就失去了與該瀏覽器的聯(lián)系。這與 HTTP 協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。
因此通過 SESSION(cookie 是另外一種解決辦法 ) 記錄用戶的有關信息,以供用戶再次以此身份對 web 服務器提起請求時作確認。會話的發(fā)明使得一個用戶在多個頁面間切換時能夠保存他的信息。網站編程人員都有這樣的體會,每一頁中的變量是不能在下一頁中使用的 ( 雖然 form , url 也可以實現,但這都是非常不理想的辦法 ) ,而 SESSION 中注冊的變量就可以作為全局變量使用了。
那么 SESSION 到底有什么用處呢?網上購物時大家都用過購物車,你可以隨時把你選購的商品加入到購物車中,最后再去收銀臺結帳。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,用它追蹤用戶在網站上的活動情況,這就是 SESSION 的作用,它可以用于用戶身份認證,程序狀態(tài)記錄,頁面之間參數傳遞等。
SESSION 的實現中采用 COOKIE 技術, SESSION 會在客戶端保存一個包含 session_id(SESSION 編號 ) 的 COOKIE ;在服務器端保存其他 session 變量,比如 session_name 等等。當用戶請求服務器時也把 session_id 一起發(fā)送到服務器,通過 session_id 提取所保存在服務器端的變量,就能識別用戶是誰了。同時也不難理解為什么 SESSION 有時會失效了。
當客戶端禁用 COOKIE 時 ( 點擊 IE 中的 “ 工具 ”—“Internet 選項 ” ,在彈出的對話框里點擊 “ 安全 ”—“ 自定義級別 ” 項,將 “ 允許每個對話 COOKIE” 設為禁用 ) , session_id 將無法傳遞,此時 SESSION 失效。不過 PHP5 在 linux/unix 平臺可以自動檢查 cookie 狀態(tài),如果客戶端設置了禁用,則系統(tǒng)自動把 session_id 附加到 url 上傳遞。 windows 主機則無此功能。
2. Session 常見函數及用法?
● Session_start() : 開始一個會話或者返回已經存在的會話。
說明:這個函數沒有參數,且返回值均為 true 。如果你使用基于 cookie 的 session(cookie-based sessions), 那么在使用 Session_start() 之前瀏覽器不能有任何輸出,否則會發(fā)生以下錯誤:
Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………
你可以在 php.ini 里啟動 session.auto_start=1 ,這樣就無需每次使用 session 之前都要調用 session_start() 。但啟用該選項也有一些限制,如果確實啟用了 session.auto_start ,則不能將對象放入會話中,因為類定義必須在啟動會話之前加載以在會話中重建對象。
請求結束后所有注冊的變量都會被序列化。已注冊但未定義的變量被標記為未定義。在之后的訪問中這些變量也未被會話模塊定義,除非用戶以后定義它們。
警告:有些類型的數據不能被序列化因此也就不能保存在會話中。包括 resource 變量或者有循環(huán)引用的對象(即某對象將一個指向自己的引用傳遞給另一個對象)。
● 注冊 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’]
=
”我是Sunglow
!
”;
//
注冊一個SESSION變量
$_SESSION
[‘passwd’]
=
”mynameisSunglow”;
$_SESSION
[‘
time
’]
=
time
();
echo
'
<br/><ahref="page2.php">通過COOKIE傳遞SESSION</a>
'
;
//
如果客戶端支持cookie,可通過該鏈接傳遞session到下一頁。
echo
'
<br/><ahref="page2.php?
'
.
SID
.
'
">通過URL傳遞SESSION</a>
'
;
//
客戶端不支持cookie時,使用該辦法傳遞session.
?>
Page2.php
<?
php
session_start
();
echo
$_SESSION
[
'
name
'
];
//
echo
$_SESSION
[
'
passwd
'
];
//
echo
date
(
'
YmdH:i:s
'
,
$_SESSION
[
'
time
'
]);
echo
'
<br/><ahref="page1.php">返回山一頁</a>
'
;
?>
有兩種方法傳遞一個會話 ID :
cookie
URL 參數
會話模塊支持這兩種方法。 cookie 更優(yōu)化,但由于不總是可用,也提供替代的方法。第二種方法直接將會話 ID 嵌入到 URL 中間去。
PHP 可以透明地轉換連接。除非是使用 PHP 4.2 或更新版本,需要手工在編譯 PHP 時激活。在 Unix 下,用 --enable-trans-sid 配置選項。如果此配置選項和運行時選項 session.use_trans_sid 都被激活 ( 修改 php.ini) ,相對 URI 將被自動修改為包含會話 ID 。
● session_id
session_id() 用于設定或取得當前 session_id 。 php5 中既可以使用 session_id() ,也可以通過附加在 url 上的 SID 取得當前會話的 session_id 和 session_name 。
如果 session_id() 有具體指定值的話,將取代當前的 session_id 值。使用該函數前必須啟動會話: session_start();
當我們使用 session cookies 時,如果指定了一個 session_id() 值,每次啟動 session_start() 都會往客戶端發(fā)送一個 cookie 值。不論當前 session_id 是否與指定值相等。
session_id() 如果沒有指定值,則返回當前 session_id(); 當前會話沒有啟動的話,則返回空字符串。
● 檢查 session 是否存在?
在以往的 php 版本中通常使用 session_is_register() 檢查 session 是否存在,如果您使用 $_SESSION[‘XXX’]=XXX 來注冊會話變量,則 session_is_register() 函數不再起作用。你可以使用
isset($_SESSION[‘xxx’]) 來替代。
● 更改 session_id session_regenerate_id() 更改成功則返回 true ,失敗則返回 false 。
使用該函數可以為當前 session 更改 session_id ,但不改變當前 session 的其他信息。例如:
<?
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>
"
;
?>
● session_name() 返回當前 session 的 name 或改變當前 session 的 name 。如果要改變當前 session 的 name ,必須在 session_start() 之前調用該函數。注意: session_name 不能只由數字組成,它至少包含一個字母。否則會在每時每刻都生成一個新的 session id.
session 改名示例:
<?
php
$previous_name
=
session_name
(
"
WebsiteID
"
);
echo
"
新的session名為:$previous_name<br/>
"
;
?>
● 如何刪除 session ?
1 、 unset ($_SESSION['xxx']) 刪除單個 session , unset($_SESSION['xxx']) 用來 unregister 一個已注冊的 session 變量。其作用和 session_unregister() 相同。 session_unregister() 在 PHP5 中不再使用,可將之打入冷宮。
unset($_SESSION) 此函數千萬不可使用,它會將全局變量 $_SESSION 銷毀,而且還沒有可行的辦法將其恢復。用戶也不再可以注冊 $_SESSION 變量。
2 、 $_SESSION=array() 刪除多個 session
3 、 session_destroy() 結束當前的會話,并清空會話中的所有資源。。該函數不會 unset( 釋放 ) 和當前 session 相關的全局變量 (globalvariables), 也不會刪除客戶端的 session cookie.PHP 默認的 session 是基于 cookie 的,如果要刪除 cookie 的話,必須借助 setcookie() 函數。
返回值:布爾值。
功能說明:這個函數結束當前的 session ,此函數沒有參數,且返回值均為 true
session_unset() 如果使用了 $_SESSION ,則該函數不再起作用。由于 PHP5 必定要使用 $_SESSION ,所以此函數可以打入冷宮了。
下面是 PHP 官方關于刪除 session 的案例:
<?
php
//
初始化session.
session_start
();
/*
**刪除所有的session變量..也可用unset($_SESSION[xxx])逐個刪除。***
*/
$_SESSION
=
array
();
/*
**刪除sessinid.由于session默認是基于cookie的,所以使用setcookie刪除包含sessionid的cookie.**
*/
if
(
isset
(
$_COOKIE
[
session_name
()])){
setcookie
(
session_name
()
,
''
,
time
()
-
42000
,
'
/
'
);
}
//
最后徹底銷毀session.
session_destroy
();
?>
Session 的中文譯名叫做 “ 會話 ” ,其本來的含義是指有始有終的一系列動作 / 消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個 session 。目前社會上對 session 的理解非?;靵y:有時候我們可以看到這樣的話 “ 在一個瀏覽器會話期間, ...” ,這里的會話是指從一個瀏覽器窗口打開到關閉這個期間; 也可以看到 “ 用戶(客戶端)在一次會話期間 ” 這樣一句話,它可能指用戶的一系列動作(一般情況下是同某個具體目的相關的一系列動作,比如從登錄到選購商品到結賬登出這樣一個網上購物的過程;然而有時候也可能僅僅是指一次連接;其中的差別只能靠上下文來推斷了。
然而當 session 一詞與網絡協(xié)議相關聯(lián)時,它又往往隱含了 “ 面向連接 ” 和 / 或 “ 保持狀態(tài) ” 這樣兩個含義, “ 面向連接 ” 指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始。 “ 保持狀態(tài) ” 則是指通信的一方能夠把一系列的消息關聯(lián)起來,使得消息之間可以互相依賴,比如一個服務員能夠認出再次光臨的老顧客并且記得上次這個顧客還欠店里一塊錢。這一類的例子有 “ 一個 TCP session” 或者 “ 一個 POP3 session” 。
鑒于這種混亂已不可改變,要為 session 下個定義就很難有統(tǒng)一的標準。而在閱讀 session 相關資料時,我們也只有靠上下文來推斷理解了。不過我們可以這樣理解:例如我們打電話,從撥通的那一刻起到掛斷電話期間,因為電話一直保持著接通的狀態(tài), 所以把這種接通的狀態(tài)叫做 session 。它是訪客與整個網站交互過程中一直存在的公有變量,在客戶端不支持 COOKIE 的時候,為了保證數據正確、安全,就采用 SESSION 變量。訪問網站的來客會被分配一個唯一的標識符,即所謂的會話 ID 。它要么存放在客戶端的 cookie ,要么經由 URL 傳遞。
SESSION 的發(fā)明填補了 HTTP 協(xié)議的局限: HTTP 協(xié)議被認為是無狀態(tài)協(xié)議,無法得知用戶的瀏覽狀態(tài),當它在服務端完成響應之后,服務器就失去了與該瀏覽器的聯(lián)系。這與 HTTP 協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關系一樣。
因此通過 SESSION(cookie 是另外一種解決辦法 ) 記錄用戶的有關信息,以供用戶再次以此身份對 web 服務器提起請求時作確認。會話的發(fā)明使得一個用戶在多個頁面間切換時能夠保存他的信息。網站編程人員都有這樣的體會,每一頁中的變量是不能在下一頁中使用的 ( 雖然 form , url 也可以實現,但這都是非常不理想的辦法 ) ,而 SESSION 中注冊的變量就可以作為全局變量使用了。
那么 SESSION 到底有什么用處呢?網上購物時大家都用過購物車,你可以隨時把你選購的商品加入到購物車中,最后再去收銀臺結帳。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,用它追蹤用戶在網站上的活動情況,這就是 SESSION 的作用,它可以用于用戶身份認證,程序狀態(tài)記錄,頁面之間參數傳遞等。
SESSION 的實現中采用 COOKIE 技術, SESSION 會在客戶端保存一個包含 session_id(SESSION 編號 ) 的 COOKIE ;在服務器端保存其他 session 變量,比如 session_name 等等。當用戶請求服務器時也把 session_id 一起發(fā)送到服務器,通過 session_id 提取所保存在服務器端的變量,就能識別用戶是誰了。同時也不難理解為什么 SESSION 有時會失效了。
當客戶端禁用 COOKIE 時 ( 點擊 IE 中的 “ 工具 ”—“Internet 選項 ” ,在彈出的對話框里點擊 “ 安全 ”—“ 自定義級別 ” 項,將 “ 允許每個對話 COOKIE” 設為禁用 ) , session_id 將無法傳遞,此時 SESSION 失效。不過 PHP5 在 linux/unix 平臺可以自動檢查 cookie 狀態(tài),如果客戶端設置了禁用,則系統(tǒng)自動把 session_id 附加到 url 上傳遞。 windows 主機則無此功能。
2. Session 常見函數及用法?
● Session_start() : 開始一個會話或者返回已經存在的會話。
說明:這個函數沒有參數,且返回值均為 true 。如果你使用基于 cookie 的 session(cookie-based sessions), 那么在使用 Session_start() 之前瀏覽器不能有任何輸出,否則會發(fā)生以下錯誤:
Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………
你可以在 php.ini 里啟動 session.auto_start=1 ,這樣就無需每次使用 session 之前都要調用 session_start() 。但啟用該選項也有一些限制,如果確實啟用了 session.auto_start ,則不能將對象放入會話中,因為類定義必須在啟動會話之前加載以在會話中重建對象。
請求結束后所有注冊的變量都會被序列化。已注冊但未定義的變量被標記為未定義。在之后的訪問中這些變量也未被會話模塊定義,除非用戶以后定義它們。
警告:有些類型的數據不能被序列化因此也就不能保存在會話中。包括 resource 變量或者有循環(huán)引用的對象(即某對象將一個指向自己的引用傳遞給另一個對象)。
● 注冊 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








Page2.php







有兩種方法傳遞一個會話 ID :
cookie
URL 參數
會話模塊支持這兩種方法。 cookie 更優(yōu)化,但由于不總是可用,也提供替代的方法。第二種方法直接將會話 ID 嵌入到 URL 中間去。
PHP 可以透明地轉換連接。除非是使用 PHP 4.2 或更新版本,需要手工在編譯 PHP 時激活。在 Unix 下,用 --enable-trans-sid 配置選項。如果此配置選項和運行時選項 session.use_trans_sid 都被激活 ( 修改 php.ini) ,相對 URI 將被自動修改為包含會話 ID 。
● session_id
session_id() 用于設定或取得當前 session_id 。 php5 中既可以使用 session_id() ,也可以通過附加在 url 上的 SID 取得當前會話的 session_id 和 session_name 。
如果 session_id() 有具體指定值的話,將取代當前的 session_id 值。使用該函數前必須啟動會話: session_start();
當我們使用 session cookies 時,如果指定了一個 session_id() 值,每次啟動 session_start() 都會往客戶端發(fā)送一個 cookie 值。不論當前 session_id 是否與指定值相等。
session_id() 如果沒有指定值,則返回當前 session_id(); 當前會話沒有啟動的話,則返回空字符串。
● 檢查 session 是否存在?
在以往的 php 版本中通常使用 session_is_register() 檢查 session 是否存在,如果您使用 $_SESSION[‘XXX’]=XXX 來注冊會話變量,則 session_is_register() 函數不再起作用。你可以使用
isset($_SESSION[‘xxx’]) 來替代。
● 更改 session_id session_regenerate_id() 更改成功則返回 true ,失敗則返回 false 。
使用該函數可以為當前 session 更改 session_id ,但不改變當前 session 的其他信息。例如:











● session_name() 返回當前 session 的 name 或改變當前 session 的 name 。如果要改變當前 session 的 name ,必須在 session_start() 之前調用該函數。注意: session_name 不能只由數字組成,它至少包含一個字母。否則會在每時每刻都生成一個新的 session id.
session 改名示例:





● 如何刪除 session ?
1 、 unset ($_SESSION['xxx']) 刪除單個 session , unset($_SESSION['xxx']) 用來 unregister 一個已注冊的 session 變量。其作用和 session_unregister() 相同。 session_unregister() 在 PHP5 中不再使用,可將之打入冷宮。
unset($_SESSION) 此函數千萬不可使用,它會將全局變量 $_SESSION 銷毀,而且還沒有可行的辦法將其恢復。用戶也不再可以注冊 $_SESSION 變量。
2 、 $_SESSION=array() 刪除多個 session
3 、 session_destroy() 結束當前的會話,并清空會話中的所有資源。。該函數不會 unset( 釋放 ) 和當前 session 相關的全局變量 (globalvariables), 也不會刪除客戶端的 session cookie.PHP 默認的 session 是基于 cookie 的,如果要刪除 cookie 的話,必須借助 setcookie() 函數。
返回值:布爾值。
功能說明:這個函數結束當前的 session ,此函數沒有參數,且返回值均為 true
session_unset() 如果使用了 $_SESSION ,則該函數不再起作用。由于 PHP5 必定要使用 $_SESSION ,所以此函數可以打入冷宮了。
下面是 PHP 官方關于刪除 session 的案例:












由此我們可以得出刪除
Session
的步驟:
① session_start()
② $_SESSION=array() /unset($_SESSION['xxx'])
③ session_destroy()
① session_start()
② $_SESSION=array() /unset($_SESSION['xxx'])
③ session_destroy()
● SESSION
安全
:
會話模塊不能保證存放在會話中的信息只能被創(chuàng)建該會話的用戶看到。根據其存放的數據,還需要采取更多措施來主動保護會話的完整性。
評估會話中攜帶的數據并實施附加保護措施通常要付出代價,降低用戶的方便程度。例如,如果要保護用戶免于受簡單的社交策略侵害(注:指在 URL 中顯示的會話 ID 會被別人在電腦屏幕上看到,或被別的網站通過 HTTP Referer 得到等),則應該啟用 session.use_only_cookies 。此情形下,客戶端必須無條件啟用 cookie ,否則會話就不工作。
有幾種途徑會將現有的會話 ID 泄露給第三方。泄露出的會話 ID 使第三方能夠訪問所有與指定 ID 相關聯(lián)的資源。第一, URL 攜帶會話 ID 。如果連接到外部站點,包含有會話 ID 的 URL 可能會被存在外部站點的 Referer 日志中。第二,較主動的攻擊者可能會偵聽網段的數據包。如果未加密,會話 ID 會以明文方式在網絡中流過。對此的解決方式是在服務器上實施 SSL 并強制用戶使用。
默認情況下,所有與特定會話相關的數據都被存儲在由 INI 選項 session.save_path 指 定的目錄下的一個文件中。對每個會話會建立一個文件(不論是否有數據與該會話相關)。這是由于每打開一個會話即建立一個文件,不論是否有數據寫入到該文件 中。注意由于和文件系統(tǒng)協(xié)同工作的限制,此行為有個副作用,有可能造成用戶定制的會話處理器(例如用數據庫)丟失了未存儲數據的會話。
上面介紹函數下文將會用到,但還有一些有關 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 相關的攻擊。
會話模塊不能保證存放在會話中的信息只能被創(chuàng)建該會話的用戶看到。根據其存放的數據,還需要采取更多措施來主動保護會話的完整性。
評估會話中攜帶的數據并實施附加保護措施通常要付出代價,降低用戶的方便程度。例如,如果要保護用戶免于受簡單的社交策略侵害(注:指在 URL 中顯示的會話 ID 會被別人在電腦屏幕上看到,或被別的網站通過 HTTP Referer 得到等),則應該啟用 session.use_only_cookies 。此情形下,客戶端必須無條件啟用 cookie ,否則會話就不工作。
有幾種途徑會將現有的會話 ID 泄露給第三方。泄露出的會話 ID 使第三方能夠訪問所有與指定 ID 相關聯(lián)的資源。第一, URL 攜帶會話 ID 。如果連接到外部站點,包含有會話 ID 的 URL 可能會被存在外部站點的 Referer 日志中。第二,較主動的攻擊者可能會偵聽網段的數據包。如果未加密,會話 ID 會以明文方式在網絡中流過。對此的解決方式是在服務器上實施 SSL 并強制用戶使用。
默認情況下,所有與特定會話相關的數據都被存儲在由 INI 選項 session.save_path 指 定的目錄下的一個文件中。對每個會話會建立一個文件(不論是否有數據與該會話相關)。這是由于每打開一個會話即建立一個文件,不論是否有數據寫入到該文件 中。注意由于和文件系統(tǒng)協(xié)同工作的限制,此行為有個副作用,有可能造成用戶定制的會話處理器(例如用數據庫)丟失了未存儲數據的會話。
上面介紹函數下文將會用到,但還有一些有關 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 相關的攻擊。
Session
跨頁傳遞問題:
發(fā)表評論
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論