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








Page2.php







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











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





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












由此我們可以得出刪除
Session
的步驟:
① session_start()
② $_SESSION=array() /unset($_SESSION['xxx'])
③ session_destroy()
① session_start()
② $_SESSION=array() /unset($_SESSION['xxx'])
③ session_destroy()
● SESSION
安全
:
會(huì)話模塊不能保證存放在會(huì)話中的信息只能被創(chuàng)建該會(huì)話的用戶看到。根據(jù)其存放的數(shù)據(jù),還需要采取更多措施來主動(dòng)保護(hù)會(huì)話的完整性。
評(píng)估會(huì)話中攜帶的數(shù)據(jù)并實(shí)施附加保護(hù)措施通常要付出代價(jià),降低用戶的方便程度。例如,如果要保護(hù)用戶免于受簡(jiǎn)單的社交策略侵害(注:指在 URL 中顯示的會(huì)話 ID 會(huì)被別人在電腦屏幕上看到,或被別的網(wǎng)站通過 HTTP Referer 得到等),則應(yīng)該啟用 session.use_only_cookies 。此情形下,客戶端必須無條件啟用 cookie ,否則會(huì)話就不工作。
有幾種途徑會(huì)將現(xiàn)有的會(huì)話 ID 泄露給第三方。泄露出的會(huì)話 ID 使第三方能夠訪問所有與指定 ID 相關(guān)聯(lián)的資源。第一, URL 攜帶會(huì)話 ID 。如果連接到外部站點(diǎn),包含有會(huì)話 ID 的 URL 可能會(huì)被存在外部站點(diǎn)的 Referer 日志中。第二,較主動(dòng)的攻擊者可能會(huì)偵聽網(wǎng)段的數(shù)據(jù)包。如果未加密,會(huì)話 ID 會(huì)以明文方式在網(wǎng)絡(luò)中流過。對(duì)此的解決方式是在服務(wù)器上實(shí)施 SSL 并強(qiáng)制用戶使用。
默認(rèn)情況下,所有與特定會(huì)話相關(guān)的數(shù)據(jù)都被存儲(chǔ)在由 INI 選項(xiàng) session.save_path 指 定的目錄下的一個(gè)文件中。對(duì)每個(gè)會(huì)話會(huì)建立一個(gè)文件(不論是否有數(shù)據(jù)與該會(huì)話相關(guān))。這是由于每打開一個(gè)會(huì)話即建立一個(gè)文件,不論是否有數(shù)據(jù)寫入到該文件 中。注意由于和文件系統(tǒng)協(xié)同工作的限制,此行為有個(gè)副作用,有可能造成用戶定制的會(huì)話處理器(例如用數(shù)據(jù)庫(kù))丟失了未存儲(chǔ)數(shù)據(jù)的會(huì)話。
上面介紹函數(shù)下文將會(huì)用到,但還有一些有關(guān) session 的函數(shù)也介紹一下:
session_encode
函數(shù)功能: sesssion 信息編碼
函數(shù)原型: string session_encode(void);
返回值:字符串
功能說明:返回的字符串中包含全局變量中各變量的名稱與值,形式如: 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
函數(shù)功能: sesssion 信息解碼
函數(shù)原型: boolean session_decode (string data)
返回值:布爾值
功能說明:這個(gè)函數(shù)可將 session 信息解碼,成功則返回邏輯值 true
PHP5 不再使用 session_id ,而是把它變成一個(gè)常量 SID ,并保存在 cookie 中。如果客戶端禁用了 cookie , php 會(huì)自動(dòng)通過 url 自動(dòng)傳動(dòng)傳遞 SID ,其條件是設(shè)置 php.ini 中的 session.use_trans_sid = 1 。此時(shí)即使客戶端即使禁用了 cookie 也沒關(guān)系了。
用 strip_tags() 來輸出 SID 以避免 XSS 相關(guān)的攻擊。
會(huì)話模塊不能保證存放在會(huì)話中的信息只能被創(chuàng)建該會(huì)話的用戶看到。根據(jù)其存放的數(shù)據(jù),還需要采取更多措施來主動(dòng)保護(hù)會(huì)話的完整性。
評(píng)估會(huì)話中攜帶的數(shù)據(jù)并實(shí)施附加保護(hù)措施通常要付出代價(jià),降低用戶的方便程度。例如,如果要保護(hù)用戶免于受簡(jiǎn)單的社交策略侵害(注:指在 URL 中顯示的會(huì)話 ID 會(huì)被別人在電腦屏幕上看到,或被別的網(wǎng)站通過 HTTP Referer 得到等),則應(yīng)該啟用 session.use_only_cookies 。此情形下,客戶端必須無條件啟用 cookie ,否則會(huì)話就不工作。
有幾種途徑會(huì)將現(xiàn)有的會(huì)話 ID 泄露給第三方。泄露出的會(huì)話 ID 使第三方能夠訪問所有與指定 ID 相關(guān)聯(lián)的資源。第一, URL 攜帶會(huì)話 ID 。如果連接到外部站點(diǎn),包含有會(huì)話 ID 的 URL 可能會(huì)被存在外部站點(diǎn)的 Referer 日志中。第二,較主動(dòng)的攻擊者可能會(huì)偵聽網(wǎng)段的數(shù)據(jù)包。如果未加密,會(huì)話 ID 會(huì)以明文方式在網(wǎng)絡(luò)中流過。對(duì)此的解決方式是在服務(wù)器上實(shí)施 SSL 并強(qiáng)制用戶使用。
默認(rèn)情況下,所有與特定會(huì)話相關(guān)的數(shù)據(jù)都被存儲(chǔ)在由 INI 選項(xiàng) session.save_path 指 定的目錄下的一個(gè)文件中。對(duì)每個(gè)會(huì)話會(huì)建立一個(gè)文件(不論是否有數(shù)據(jù)與該會(huì)話相關(guān))。這是由于每打開一個(gè)會(huì)話即建立一個(gè)文件,不論是否有數(shù)據(jù)寫入到該文件 中。注意由于和文件系統(tǒng)協(xié)同工作的限制,此行為有個(gè)副作用,有可能造成用戶定制的會(huì)話處理器(例如用數(shù)據(jù)庫(kù))丟失了未存儲(chǔ)數(shù)據(jù)的會(huì)話。
上面介紹函數(shù)下文將會(huì)用到,但還有一些有關(guān) session 的函數(shù)也介紹一下:
session_encode
函數(shù)功能: sesssion 信息編碼
函數(shù)原型: string session_encode(void);
返回值:字符串
功能說明:返回的字符串中包含全局變量中各變量的名稱與值,形式如: 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
函數(shù)功能: sesssion 信息解碼
函數(shù)原型: boolean session_decode (string data)
返回值:布爾值
功能說明:這個(gè)函數(shù)可將 session 信息解碼,成功則返回邏輯值 true
PHP5 不再使用 session_id ,而是把它變成一個(gè)常量 SID ,并保存在 cookie 中。如果客戶端禁用了 cookie , php 會(huì)自動(dòng)通過 url 自動(dòng)傳動(dòng)傳遞 SID ,其條件是設(shè)置 php.ini 中的 session.use_trans_sid = 1 。此時(shí)即使客戶端即使禁用了 cookie 也沒關(guān)系了。
用 strip_tags() 來輸出 SID 以避免 XSS 相關(guān)的攻擊。
Session
跨頁(yè)傳遞問題:
- 2008-02-26 14:12
- 瀏覽 282
- 評(píng)論(0)
- 相關(guān)推薦
發(fā)表評(píng)論
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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

評(píng)論