【CyberSecurityLearning 48】PHP Cookie 和 SESSION
目錄
會話控制
COOKIE
?
session機制
session_start
$_SESSION? 完成對session數(shù)據(jù)的讀寫
源碼
使用Cookie實現(xiàn)對用戶登錄的驗證
index.php
login.php
logout.php
Cookie存在的風(fēng)險實驗(cookie被竊取)
1.php(開啟session機制)
2.php()
使用session機制實現(xiàn)用戶登入驗證
index.php
login.php
logout.php
session安全性實驗
?
會話控制
瀏覽網(wǎng)頁的時候,使用的是HTTP協(xié)議。
客戶端發(fā)出請求
服務(wù)端給出響應(yīng)
COOKIE
cookie就是“身份證”
存儲在客戶端的一段文本,文件|字符串(大多數(shù)情況下,字符串)
服務(wù)器發(fā)給客戶端(cookie存儲在客戶端)
每次客戶端瀏覽器 在發(fā)出請求的時候,自動都會攜帶Cookie信息
cookie信息也是鍵值對的形式
cookie信息是從服務(wù)器端向客戶端寫入的
設(shè)置cookie的語句:setcookie();
<?php setcookie("name","GGG"); //setcookie就是PHP中設(shè)置cookie的一個語句,服務(wù)器端向客戶端寫入 ?>setcookie返回的是一個布爾類型的值!
setcookie的屬性(性質(zhì)):
name??????? Cookie的名稱
value??????? Cookie的值
expire??? ?? 過期時間(終止; 到期)
path?????? ?? Cookie的有效路徑
domain???? Cookie的域名
secure????? https(如果不是https,cookie就用不了)
httponly??? 僅僅通過http 協(xié)議訪問,不能通過JS訪問
瀏覽器cookie信息在哪里看?F12--存儲
服務(wù)器端向客戶端寫入cookie(身份證)的過程:
瀏覽器在訪問頁面是時候會自動攜帶cookie信息
1.php代碼:
<?php setcookie("name","AJEST",null,null,null,null,null); // setcookie有七個參數(shù) //過期時間寫null就是瀏覽器關(guān)閉的時候到期 //路徑寫null就是默認 //null就是默認,不寫就用默認選項 /* name Cookie的名稱 value Cookie的值 expire 過期時間(終止; 到期) path Cookie的有效路徑 domain Cookie的域名 secure https(如果不是https,cookie就用不了) httponly 僅僅通過http 協(xié)議訪問,不能通過JS訪問 */?>?
服務(wù)器怎么接收cookie信息
$_COOKIE
2.PHP代碼:
<?php var_dump($_COOKIE); ?>通過這個過程就完成了下發(fā)身份證再上傳身份證的過程:
下發(fā)是通過setcookie()下發(fā)cookie
我們怎么提供身份證信息?(每次客戶端瀏覽器 在發(fā)出請求的時候,自動都會攜帶Cookie信息)
竊取和欺騙
竊取是被竊取,就是你身份證丟了(身份證是放在客戶端)
欺騙就是攻擊者欺騙服務(wù)器
實際上身份證放在我們?yōu)g覽器端是不安全的,所以我們可以考慮把身份證放在服務(wù)器端
如果我們把身份證放在服務(wù)器端,這種機制叫Session機制
session機制
session會把我們的身份證放在服務(wù)器端,但是session機制要依賴cookie實現(xiàn),說明我們cookie是存放在瀏覽器端的一個文本,session也就是我們用戶信息是存在服務(wù)器端的,但是我們session要依賴cookie來實現(xiàn),我們session有個屬性叫session id,這個session id也是發(fā)給瀏覽器的。
session id也有竊取和欺騙的風(fēng)險,但是我們身份證放在服務(wù)器端,比放在瀏覽器端更安全!
session_start
session的實現(xiàn)我們需要session_start
<?php session_start();//開啟session機制 ?>再打開一個瀏覽器localhost/1.php,會發(fā)現(xiàn)這兩個瀏覽器的session id不一樣,意味著通過這個session id就可以區(qū)分不同的用戶
session是放在服務(wù)器端的,那他到底放在服務(wù)器端的哪個位置呢?放在哪個緩存下
$_SESSION? 完成對session數(shù)據(jù)的讀寫
?
源碼
使用Cookie實現(xiàn)對用戶登錄的驗證
index.php
<meta charset="utf-8"> <h1>剎那芳華論壇</h1><?php if(isset($_COOKIE['name'])){echo "歡迎您,{$_COOKIE['name']} <a href='./logout.php'>注銷</a>"; }else{echo "<a href='./login.php'>請登錄</a>"; } ?>login.php
<meta charset="utf-8"> <?php if(isset($_POST['userSubmit'])){if(isset($_POST['userName']) && $_POST['userName']=="AJEST"&& isset($_POST['userPass']) && $_POST['userPass']=="123456"){if(setcookie("name","AJEST")){echo "登錄成功,<a href='./index.php'>返回首頁</a>";}else{echo "設(shè)置cookie錯誤";}}else{echo "用戶名或密碼錯誤<a href='./login.php'>請重新登錄</a>";} }else{ $htm=<<<HTML <formaction="" method="post" > 用戶名:<input type="text" name="userName"><br/> 密碼:<input type="password" name="userPass"><br/> <input type="submit" name="userSubmit" value="登錄"><br/> </form> HTML;echo $htm; }?>logout.php
<meta charset="utf-8"> <?php setcookie("name",$_COOKIE['name'],time()-3600); //time()是當(dāng)前時間 echo "已注銷,<a href='./index.php'>返回首頁</a>"; ?>進入首頁(index.php)
登錄(login.php)
注銷(logout.php)
Cookie存在的風(fēng)險實驗(cookie被竊取)
竊取Cookie,直接登入
在一個瀏覽器上登入
打開另外一個瀏覽器的localhost頁面,看到屬于未登錄狀態(tài),但是由于我們知道了cookie信息竊取了
我們打開console面板,寫如cookie信息
document.cookie=("name=AJEST")
再刷新一下頁面,就可以直接登錄
現(xiàn)在,我們將第一個瀏覽器的頁面注銷,cookie信息被清空
但在另一個瀏覽器上沒有收到任何影響
1.php(開啟session機制)
<?phpsession_start();//開啟session 機制$_SESSION['name']="GGG";$_SESSION['age']=24;?>會在服務(wù)器端生成一個文件:
相比之下session要相對安全
2.php()
<?phpsession_start();var_dump($_SESSION);?> 我們只要在頁面中開啟了session_start 2.php就會根據(jù)我們客戶端傳過來的session id去找我們對應(yīng)的緩存 如果緩存有值,$_SESSION就會獲取存儲在服務(wù)器端的session的這些變量打開服務(wù)器端的session文件,會看到里面存放了我們前面設(shè)置的信息
使用session機制實現(xiàn)用戶登入驗證
index.php
<?php session_start();//session_start()要寫在最前面,前面不能有任何輸出 ?> <meta charset="utf-8"> <h1>剎那芳華論壇</h1> <?php if(isset($_SESSION['userName']) && $_SESSION['userName'] =="GGG") {echo "歡迎您,{$_SESSION['userName']} <a href='./logout.php'>注銷</a>"; } else {echo "<a href='./login.php'>請登錄</a>"; } ?>login.php
<?php session_start(); echo "<meta charset='utf-8'>"; ?> <?php if(isset($_POST['userSubmit'])){if(isset($_POST['userName']) &&isset($_POST['userPass']) &&$_POST['userName'] == "GGG" &&$_POST['userPass'] == "123456"){$_SESSION['userName'] = $_POST['userName'];echo "登錄成功,<a href='./index.php'>返回首頁</a>";}else{echo "用戶或密碼錯誤,<a href='./login.php'>請重新登錄</a>";}}else{$html=<<<HTML <formaction=""method="post" > 用戶名:<input type="text" name="userName"><br /> 密碼:<input type="password" name="userPass"><br /> <input type="submit" name="userSubmit" value="登錄"> </form> HTML;echo $html; } ?>logout.php
<?php session_start(); session_destroy();//session的注銷函數(shù) echo "<meta charset='utf-8'>已注銷,<a href='./index.php'>返回首頁</a>"; ?>在服務(wù)器端,生成一個與session值相對應(yīng)的文件,文件為空
登錄成功
再來看我們服務(wù)器端的session文件,存入了登錄驗證信息
返回首頁
注銷
與之對應(yīng)的在服務(wù)器端,session文件被清空刪除
session安全性實驗
通樣我們在另一個瀏覽器上打開,利用session值登入測試
服務(wù)器端與之對應(yīng)的session值文件中存入信息
打開另外一個瀏覽器,生成新的sess值
替換前面的sess值
刷新:直接就進去了
當(dāng)我們在第一個瀏覽器上注銷之后
在另一個瀏覽器上使用前面的session值就會失效
因為服務(wù)器端與之對應(yīng)的session文件內(nèi)容已被清空,整個sessiom值失效了
因此,我們?nèi)粘I钪幸矐?yīng)該要重視注銷這一環(huán)節(jié),隨手注銷是個好習(xí)慣!
?
總結(jié)
以上是生活随笔為你收集整理的【CyberSecurityLearning 48】PHP Cookie 和 SESSION的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:宋杰(1980-),男,博士,东北
- 下一篇: 一种情感判别分析体系在汽车品牌舆情管理中