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