PHP COOKIE 和 SESSION

114 阅读2分钟

​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

会话控制

浏览网页的时候,使用的是HTTP协议

客户端发送请求

服务的给出相应

COOKIE

存储在客户端的一段文本,文件|字符串(大多数情况下,字符串)

服务器发给客户端

每次客户端浏览器 在发出请求的时候,自动都会携带Cookie信息

键值对

cookie性质

name    Cookie的名称

value    Cookie的值

expire   过期时间

path    Cookie的有效路径

domain   Cookie的域名

secure    https

httponly    仅仅通过http 协议访问,不能通过JS访问

设置Cookie的语句

setcookie();

接受Cookie 的信息

$_COOKIE

窃取和欺骗

浏览器Cookie 信息

F12(存储器)

session 机制

依赖Cookie实现

session id

session_start();

$_SESSION    完成对SESSION 数据的读写

源码:


1.php(设置Cookie)

<?php
setcookie("name","GGG");
?>


2.phphc($_COOKIE)

<?php
var_dump($_COOKIE);
?>


使用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'] == "GGG" &&
		isset($_POST['userPass']) &&
		$_POST['userPass'] == "123456"
	){
		if(setcookie("name","GGG")){
			echo "登录成功,<a href='./index.php'>返回首页</a>";
		}else{
			echo "设置Cookie错误!";
		}
	}else{
		echo "用户或密码错误,<a href='./login.php'>请重新登录</a>";
	}
}else{
	$html=<<<HTML

<form
	action=""
	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

<meta charset="utf-8">
<?php
setcookie("name",$_COOKIE['name'],time()-3600);
echo "已注销,<a href='./index.php'>返回首页</a>";
?>

进入首页(index.php)

登录(login.php)

注销(logout.php)


Cookie存在的风险实验

窃取Cookie,直接登入

在一个浏览器上登入

打开另外一个浏览器

现在,我们将第一个浏览器的页面注销,cookie信息被清空

但在另一个浏览器上没有收到任何影响


1.php(开启session机制)

<?php
session_start();//开启session 机制
$_SESSION['name']="GGG";
$_SESSION['age']=24;
?>

会在服务器端生成一个文件:

相比之下session要相对安全


2.php()

<?php
session_start();
var_dump($_SESSION);
?>

打开服务器端的sess文件,会看到里面存放了我们前面设置的信息


使用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
	<form
	action=""
	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();
echo "<meta charset='utf-8'>已注销,<a href='./index.php'>返回首页</a>";
?>

在服务器端,生成一个与session值相对应的文件,文件为空

登录成功

再来看我们服务器端的sess文件,存入了登录验证信息

返回首页

注销

与之对应的在服务器端,sess文件被清空删除


session安全性实验

通样我们在另一个浏览器上打开,利用sess值登入测试

服务器端与之对应的sess值文件中存入信息

打开另外一个浏览器,生成新的sess值

替换前面的sess值

刷新:直接就进去了

当我们在第一个浏览器上注销之后

在另一一个浏览器上使用前面的sess值就会失效

因为服务器端与之对应的sess文件内容已被清空,整个sess值失效了

因此,我们日常生活中也应该要重视注销这一环节,随手注销首个好习惯!


 参考文献:

千峰网络信息安全开源课程