首頁 後端開發 php教程 PHP 不得不提起的 session 與 cookie

PHP 不得不提起的 session 與 cookie

Sep 11, 2019 am 11:25 AM
cookie php session

PHP 不得不提起的 session 與 cookie

session 與 cookie 是什麼?

session 與 cookie 屬於一種會話控制技術。常用在身分識別,登入驗證,資料傳輸等。舉個例子,就像我們去超市買東西結帳的時候,我們要拿出我們的會員卡才會獲得優惠。這時候,我們要怎麼辨識這個會員卡真實有效的呢?當我們將會員號碼給到收銀員,收銀員根據我們提供的會員號,輸入到系統中,系統根據這個會員號去查詢,如果查詢到了就證明這個會員號是真實存在的。這裡的會員號碼就好比 cookie 與 session. 會員系統就好比伺服器端,收銀員就好比客戶端.

 為什麼會用到 session 與 cookie 呢?

根據上述的例子,我們知道 session 與 cookie 是可以做什麼的了,那為什麼必須用這個來實現呢?這裡就有必要了解 http 應用傳輸協定的特點了。由於http 協定是無狀態的,即瀏覽器去請求了一個網頁,這時候就是一個http 請求,當服務端接收到請求之後,返回客戶端需要的數據,在這過程中瀏覽器與伺服器是建立了一個連接的。但是當服務端傳回數據,客戶端收到數據之後,他們的這種連接關係就斷開了。下次瀏覽器再去發送請求的時候,又是重新建立一個連接,這兩個連結沒有任何關係。試想一下,當我們登入一個商場系統的時候,進入首頁做了登錄操作,但是我們下單或者加入購物車的時候,還需要登錄,每訪問一個頁面就要登錄,是不是很繁瑣同時也是很不科學的,萬一我們加入購物車的商品,我們點擊下單了,下單頁面要登錄而且還無法正確的反饋出你下單時的那些商品.

 Http 特點

1.http 協定支援客戶端/ 服務端模式,也是一種請求/ 回應模式的協定。

2. 無連線。所謂的無連線就是伺服器收到了客戶端的請求之後,回應完成並收到客戶端的應答之後,即斷開連線。限制每次的連線只處理一次請求。從而節省傳輸時間。

3. 無狀態。 http 協定對事務的處理沒有記憶能力。也意味著如果需要前面的訊息,只能重傳,這無形之中增加資料的傳輸量。這種方式某種方面上講解放了伺服器,但是卻不利於客戶端與伺服器的連線。為了彌補這個不足,產生了兩種記錄 http 狀態的技術,一個叫做 Cookie, 一個叫做 Session,後面我們再細講它們。

4. 簡單快速:所謂的簡單快速是指客戶端向伺服器要求服務時,一般來說只需要傳輸請求方法和路徑,就能進行存取

5. 靈活:這裡主要指的是客戶端可以透過http 協定傳輸任意類型的資料。例如傳輸.jpg 檔案、.ppt 檔案等等,只需要設定 content-type 就可以進行傳輸。

 Cookie

 cookie 的基本概念

cookie 是遠端瀏覽器儲存資料以此追蹤使用者和識別使用者的機制,從實作來說,cookie 是儲存在客戶端上的資料片段。

 cookie 的運作原理與儲存機制

. 運作原理

1. 客戶端向服務端發起一個http 請求.

2. 服務端設定一個建立cookie 的指令,回應給客戶端.

3. 客戶端收到服務端回應的指令,根據指令在客戶端建立一個cookie.

4. 擋下一次請求時,客戶端攜帶這個cookie 向服務端發送請求.

#. 儲存機制

總的來說,cookie 在客戶端儲存的形式有三種,不同的瀏覽器的儲存機制不同,存的cookie 也不同.

1. 檔案儲存。瀏覽器會針對不同的網域,在磁碟的對應目錄建立一個單獨的文件,來儲存該網域下面的 cookie 值.

2. 記憶體儲存。當瀏覽器關閉時,該 cookie 隨之消失。根據下面的建立語法,當我們未設定過期時間時則會出現這種情況.

3.flash 儲存。這種儲存方式是永久儲存在磁碟中,即使透過瀏覽器刪除一些資料都是無法刪除該方式儲存的cookie,如果需要刪除,可能透過磁碟的方式.

 cookie 的設置

Bool setcookie(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly = false]]]]] );
登入後複製

$name:cookie儲存的名稱,必填選項.

$values:cookie儲存的值。這裡要注意的是,當把該值設為false時,客戶端會嘗試刪除這個cookie值,因此在要將值這是為true或false的時候,我們用另外的值來代替,例如true用1代替,false用0來代替.

$expire:cookie的过期时间,秒为单位,当该值被设置时,定时删除;当该值没有设置时,该值是永久有效的.该值设置为小于当前时间时,会出发浏览器的删除机制,会自动删除cookie.

$path:cookie有效的目录,默认的目录是"/",即表示当前的正个域名都生效.

$domain:cookie的作用域名,默认的是当前域名有效,如果需要设置直接填写生效的域名即可.需要注意的是IE浏览器有长度限制,当只有大于5的时候才会生效.

$secure:cookie的加密处理,当设置为true的时候,需要使用HTTPS协议,才会生效.

$httpOnly:决定cookie是否只使用http协议,当设置为1或者true,其他非http协议是无法操作cookie的。例如我们未设置的时候,我们JavaScript是可以对cookie进行设置的.这样一定程度上保证了安全性.这种情况需考虑浏览器是否支持该配置项.

. 设置 cookie 的函数还有 setrawcookie () 函数,只不过该函数不会对值 进行 urlencode 序列号.

. 有时候,我们可能遇到这种情况,我们在这个页面设置了 cookie,但是去刷新页面获取 cookie,按理说是会获取到 cookie 的,但实际情况是无法获取到,这是由于 cookie 运行机制导致,PHP 创建了 cookie 这个指令,告诉浏览器,你需要执行这个指令了,这时候浏览器才会去执行这个指令,因此是无法获取到 cookie 的.

. 在设置 cookie 之前,不能有任何输出.

// 实现方式一
setcookie($cookie,"hello,world!", 3600);
// 实现方式二
header("header("Set-Cookie: testcookie=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));");
// 两则的作用是一样的,setcookie是PHP内置函数,是对http协议的操作封装。
登入後複製

cookie 的获取

$_COOKIE['$cookeName'];
登入後複製

cookie 的应用

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

cookie 跨域设置

我们都知道,在前端开发中时常会遇到 ajax 跨域问题,我们解决的方式有很多种,可以参考这篇文章传送门 1,传送门 2,cookie 跨域我们可以参考 p3p 传输协议传送门

cookie 使用的注意事项

. 数量限制,客户端对每一个 domian 下的 cookie 是有数量限制的,不是创建任意数量就行.

. 安全性,根据上面的创建语法,我们可以得知,当我们未设置 $httpOnly 值得时候,非 http 协议是可以操作 cookie 的值的,例如 JavaScript 通过 cookie ($cookieName). 而且一些抓包工具也是可以抓取到 cookie 的,还有就是 cookie 存储在客户端的文件中,如果获取到这个 cookie,也是可以对 cookie 做一些操作的。为了防止别人可以拷贝 cookie 文件,进行恶意操作,可以对 cookie 进行加密处理.

数据传输:当 cookie 数量很多,数据很大的时候,其实对于带宽是有消耗的。比较 http 传输都需要带宽,当 http 传输的数据量大了,带了的带宽消耗就大.

Session

运行原理与存储机制

. 运行原理

1. 客户端向服务端发起请求,建立通信

2. 服务端根据设置的 session 创建指令,在服务端创建一个编号为 sessionid 的文件,里面的值就是 session 具体的值 (组成部分 变量名 | 类型 : 长度:值).

3. 服务端将创建好的 sessionid 编号响应给客户端,客户则将该编号存在 cookie 中 (一般我们在浏览器存储的调试栏中会发现 cookie 中有一个 PHPSESSID 的键,这就是 sessionid,当然这个名称,我可以通过设置服务端是可以改变的).

. 当下一次请求时,客户端将这个 sessionid 携带在请求中,发送给服务端,服务端根据这个 sessionid 来做一些业务判断.

. 存储机制

1. 存储方式.session 默认是文件存储的。我们可以通过 php.ini 的配置来设置存储驱动传送门

2. 生命周期。当我们未设置 session 的生命周期时,当浏览器关闭之后存储在客户端的 phpsessid 自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个 phpsessid. 之前的 session,PHP 会自动的根据垃圾回收机制自动删除。这里我们可以根据 session_set_cookie_params ($expire) 函数来设置一个生命周期;

session 的设置

session_start();
$_SESSION = $values;
登入後複製

. session_start () 设置之前,不能有任何输出

session 的获取

$_SESSION['values'];
登入後複製

session 的删除

// 只是单纯的给重新赋了一个空的值
$_SESSION['values'] = '';
// 该函数是清空所有的session,慎用!
session_destroy();
// 连values这个session键都会删除
unset($_SESSION['values']);
登入後複製

 session 的使用场景

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

 session 的注意事项

. 安全性,sessionid 是按照一定的算法生成,要保证 session 的值唯一性和随机性.

. 用戶端停用cookie,根據上面session 的運作原理可以得出,session 的儲存於傳送還是依賴於客戶端,因此當客戶端停用cookie 時,客戶端是無法保存PHPSESSID 的,這時候可以透過url 重寫或表單來實現session 的傳輸.

. 儲存優化,按照上面的session 創建,所有的session 都會創建在一個目錄下面,同時有的無效session 在垃圾回收機制時間內還不會刪除,當一台伺服器配置的站點較多時,這時候會產生很多的session 文件,導致我們讀取速度變慢,我們可以設置session 的存儲目錄級別,save_path 函數. 一般大型的項目(如分佈式的項目), 可以使用其他的存儲方式,如數據存儲,內存存儲.

 session 與cookie 的區別

. session 存儲在服務端,cookie 存儲在客戶端.

.cookie 的建立指令由服務端設定.

.session 的sessionid 需要客戶端儲存.

 cookie 與session 的幾個誤區

. 用戶端禁止cookie,session 無法使用?

使用url重寫或表單提交可以實現.

.session 和 cookie 的安全性比較,session 存在客戶端安全性更高?

由於cookie是存在客戶端的,相對來說安全性是要低一些,不過在創建的時候可以設定$httpOnly值.

由於cookie與session是相互關聯的,獲取到cookie一定程度上取得到了session,同樣可以操作session.

.cookie 與session 是不是在瀏覽器關閉的時候會消失?

這需要查看儲存機制了。 cookie可以存文件,內存,flash.存內存當然瀏覽器關閉則消失了;session由於垃圾回收機制,當在垃圾回收機制內是不會刪除的,除非你代碼中顯示的做了刪除操作.

.cookie 是儲存在客戶端中,如何增加其安全性?

我們可以在設定cookie的時候,增加一些特殊參數,如客戶端資訊ip、瀏覽器資訊等.

. 當cookie 存在客戶端的檔案中,是不是每個瀏覽器取得到這個檔案都可以進行操作?

要看瀏覽器之間對cookie的管理機制是不是一樣.

相關推薦:《PHP教學

以上是PHP 不得不提起的 session 與 cookie的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles