第23天:安全开发-PHP应用后台模块SessionCookieToken身份验证唯一性

第二十三天

在这里插入图片描述

一、PHP后台身份验证模块实现

image-20240415113234324

image-20240415113244797

二、Cookie&Session技术&差异

1.生成cookie的原理图过程:见上图

  1. 客户端向服务器发送HTTP请求。
  2. 服务器检查请求头中是否包含cookie信息。
  3. 如果请求头中包含cookie信息,则服务器使用该cookie来识别客户端,否则服务器将生成一个新的cookie。
  4. 服务器在响应头中设置cookie信息并将其发送回客户端。
  5. 客户端接收响应并将cookie保存在本地。
  6. 当客户端发送下一次HTTP请求时,它会将cookie信息附加到请求头中。
  7. 服务器收到请求并检查cookie的有效性。
  8. 如果cookie有效,则服务器响应请求。否则,服务器可能会要求客户端重新登录。

2.session原理

  1. 客户端向服务器发送HTTP请求。
  2. 服务器为客户端生成一个唯一的session ID,并将其存储在服务器端的存储器中(如文件、数据库等)。
  3. 服务器将生成的session ID作为一个cookie发送给客户端。
  4. 客户端将session ID保存为一个cookie,通常是在本地浏览器中存储。
  5. 当客户端在发送下一次HTTP请求时,它会将该cookie信息附加到请求头中,以便服务器可以通过该session ID来识别客户端。
  6. 服务器使用session ID来检索存储在服务器端存储器中的与该客户端相关的session数据,从而在客户端和服务器之间共享数据。

3.函数解释

1.cookie

setcookie(): 设置一个cookie并发送到客户端浏览器。

unset(): 用于删除指定的cookie。

2.session

session_start(): 启动会话,用于开始或恢复一个已经存在的会话。

$_SESSION: 用于存储和访问当前会话中的所有变量。

session_destroy(): 销毁当前会话中的所有数据。

session_unset(): 释放当前会话中的所有变量。

Session存储路径:PHP.INI中session.save_path设置路径

3.安全知识

Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制

1.存储位置不同:

Cookie是存储在客户端(浏览器)上的,而Session是存储在服务器端的。

2.安全性不同:

Cookie存储在客户端上,可能会被黑客利用窃取信息,而Session存储在服务器上,更加安全。

3.存储容量不同:

Cookie的存储容量有限,一般为4KB,而Session的存储容量理论上没有限制,取决于服务器的硬件和配置。

4.生命周期不同:

Cookie可以设置过期时间,即便关闭浏览器或者重新打开电脑,Cookie仍然存在,直到过期或者被删除。而Session一般默认在浏览器关闭后就会过期。

5.访问方式不同:

Cookie可以通过JavaScript访问,而Session只能在服务器端进行访问。

6.使用场景不同:

Cookie一般用于存储小型的数据,如用户的用户名和密码等信息。而Session一般用于存储大型的数据,如购物车、登录状态等信息。

7.总结:

总之,Cookie和Session都有各自的优缺点,选择使用哪一种方式,取决于具体的应用场景和需求。一般来说,如果需要存储敏感信息或者数据较大,建议使用Session;如果只需要存储少量的数据,并且需要在客户端进行访问,可以选择使用Cookie。


三、Token数据包唯一性应用场景

1.token原理

  1. 随机生成Token并将其存储在Session
  2. 生成Token并将其绑定在Cookie触发
  3. 尝试登录表单中带入Token验证逻辑
  4. 思考Token安全特性

2.安全知识

在Web应用程序中,使用token和不使用token的主要差异在于身份验证和安全性

1.身份验证:

采用token机制的Web应用程序,用户在登录成功后会收到一个token,这个token可以在每次请求时发送给服务器进行身份验证。而不采用token机制的Web应用程序,一般会使用session机制来保存用户登录状态,服务器会在用户登录成功后创建一个session,之后的每个请求都需要在HTTP头中附带这个session ID,以便服务器能够验证用户身份。

2.安全性:

采用token机制的Web应用程序,在服务器上不会存储用户的登录状态,只需要存储token即可。因此,即使token被盗取,黑客也无法获得用户的密码或者其他敏感信息。而不采用token机制的Web应用程序,一般会在服务器上存储用户的登录状态,因此如果服务器被黑客攻击,黑客可能会获得用户的敏感信息。

3.跨域访问:

采用token机制的Web应用程序,在跨域访问时,可以使用HTTP头中的Authorization字段来传递token信息,方便实现跨域访问。而不采用token机制的Web应用程序,在跨域访问时,需使用cookie或session来传递用户身份信息,比较麻烦。

4.总结

总之,采用token机制可以提高Web应用程序的安全性,并且方便实现跨域访问。不过,使用token机制也需要开发者自己来实现身份验证和token的生成和验证,相对来说比较复杂。而不采用token机制,使用session机制则相对简单,但是安全性相对较低。因此,具体采用哪种机制,需要根据实际情况进行权衡和选择。


四.环境复现

1.用cookie做后台身份验证

1.admin-c.php源码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>后台登录</title><style>body {background-color: #f1f1f1;}.login {width: 400px;margin: 100px auto;background-color: #fff;border-radius: 5px;box-shadow: 0 0 10px rgba(0,0,0,0.3);padding: 30px;}.login h2 {text-align: center;font-size: 2em;margin-bottom: 30px;}.login label {display: block;margin-bottom: 20px;font-size: 1.2em;}.login input[type="text"], .login input[type="password"] {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 5px;font-size: 1.2em;margin-bottom: 20px;}.login input[type="submit"] {background-color: #2ecc71;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;font-size: 1.2em;cursor: pointer;}.login input[type="submit"]:hover {background-color: #27ae60;}</style>
</head>
<body>
<div class="login"><h2>后台登录</h2><form action="" method="post"><label for="username">用户名:</label><input type="text" name="username" id="username" required><label for="password">密码:</label><input type="password" name="password" id="password" required><input type="submit" value="登录"></form>
</div>
</body>
</html><?php
// 包含配置文件
include '../config.php';// 登录文件
/** 1、接受输入的帐号密码* 2、判断帐号密码正确性* 3、正确后生成的cookie进行保存* 3.1 错误的帐号密码就进行提示* 4、跳转至成功登录的页面*/// 1、接受输入的帐号密码
$user = $_POST['username'];
$pass = $_POST['password'];// 2、判断帐号密码正确性
// 连接数据库 进行数据库查询将数据进行对比
$sql = "select * from admin where username='$user' and password='$pass';";
$data = mysqli_query($con, $sql);// 如果是通过 POST 方法提交的表单
if ($_SERVER["REQUEST_METHOD"] == "POST") {// 判断用户登录成功if (mysqli_num_rows($data) > 0) {$expire = time() + 60 * 60 * 24 * 30; // 一个月后过期setcookie('username', $user, $expire, '/');setcookie('password', $pass, $expire, '/');//echo '<script>alert("登录成功!")</script>';header('Location: index-c.php');exit();} else {// 判断用户登录失败echo '<script>alert("登录失败!")</script>';}
}
?>
2.index-c.php源码
<?php
// 检查用户是否登录,如果未登录则重定向到登录页面
if ($_COOKIE['username'] !== 'admin' || $_COOKIE['password'] !== '123456') {header('Location: admin-c.php');exit(); // 终止脚本执行,确保页面重定向生效
}
?><!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>后台首页</title>
</head>
<body>
<h1>后台首页</h1>
<p>欢迎您,<?php echo $_COOKIE['username']; ?></p>
<p><a href="logout-c.php">退出登录</a></p>
</body>
</html>
3.logout-c.php源码
<?php
// 删除存储在客户端的用户凭据的 Cookie
setcookie('username', '', time() - 3600, '/');
setcookie('password', '', time() - 3600, '/');// 跳转到登录页面
header('Location: admin-c.php');
exit; // 终止脚本执行,确保页面重定向生效
?>

2.用session做后台身份验证

1.admin-s.php源码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>后台登录</title><style>body {background-color: #f1f1f1;}.login {width: 400px;margin: 100px auto;background-color: #fff;border-radius: 5px;box-shadow: 0 0 10px rgba(0,0,0,0.3);padding: 30px;}.login h2 {text-align: center;font-size: 2em;margin-bottom: 30px;}.login label {display: block;margin-bottom: 20px;font-size: 1.2em;}.login input[type="text"], .login input[type="password"] {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 5px;font-size: 1.2em;margin-bottom: 20px;}.login input[type="submit"] {background-color: #2ecc71;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;font-size: 1.2em;cursor: pointer;}.login input[type="submit"]:hover {background-color: #27ae60;}</style>
</head>
<body>
<div class="login"><h2>后台登录</h2><form action="" method="post"><label for="username">用户名:</label><input type="text" name="username" id="username" required><label for="password">密码:</label><input type="password" name="password" id="password" required><input type="submit" value="登录"></form>
</div>
</body>
</html><?php
// 包含配置文件
include '../config.php';// 登录文件-采用session验证// 1、接受输入的帐号密码
$user = $_POST['username'];
$pass = $_POST['password'];// 2、判断帐号密码正确性
// 连接数据库 进行数据库查询将数据进行对比
$sql = "select * from admin where username='$user' and password='$pass';";
$data = mysqli_query($con, $sql);// 如果是通过 POST 方法提交的表单
if ($_SERVER["REQUEST_METHOD"] == "POST") {// 判断用户登录成功if (mysqli_num_rows($data) > 0) {// 启动会话session_start();// 将用户名和密码存储到会话中$_SESSION['username'] = $user;$_SESSION['password'] = $pass;// 跳转到成功登录的页面header('Location: index-s.php');exit(); // 终止脚本执行,确保页面重定向生效} else {// 判断用户登录失败echo '<script>alert("登录失败!")</script>';}
}
?>

2.index-s.php源码

<?php
// 登录成功首页文件-采用session验证// 启动会话
session_start();// 如果会话中的用户名和密码与预期不符,则重定向到登录页面
if ($_SESSION['username'] !== 'admin' || $_SESSION['password'] !== '123456') {header('Location: admin-s.php');exit(); // 终止脚本执行,确保页面重定向生效
}
?><!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>后台首页</title>
</head>
<body>
<h1>后台首页</h1>
<p>欢迎您,<?php echo $_SESSION['username']; ?></p>
<p><a href="logout-s.php">退出登录</a></p>
</body>
</html>
3.logout-s.php源码
<?php
// 开始会话
session_start();// 清除 SESSION 变量,并销毁会话
session_unset(); // 清除所有的会话变量
session_destroy(); // 销毁会话// 重定向到登录页面
header('Location: admin-s.php');
exit; // 终止脚本执行,确保页面重定向生效
?>

3.用token做用户登录判断

1.token.php源码
<?php
// 开始会话
session_start();// 生成Token并将其存储在Session中
// 生成一个16字节的随机Token,并将其转换为十六进制表示存储在Session中
$_SESSION['token'] = bin2hex(random_bytes(16));
?><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>后台登录</title><style>body {background-color: #f1f1f1;}.login {width: 400px;margin: 100px auto;background-color: #fff;border-radius: 5px;box-shadow: 0 0 10px rgba(0,0,0,0.3);padding: 30px;}.login h2 {text-align: center;font-size: 2em;margin-bottom: 30px;}.login label {display: block;margin-bottom: 20px;font-size: 1.2em;}.login input[type="text"], .login input[type="password"] {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 5px;font-size: 1.2em;margin-bottom: 20px;}.login input[type="submit"] {background-color: #2ecc71;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;font-size: 1.2em;cursor: pointer;}.login input[type="submit"]:hover {background-color: #27ae60;}</style>
</head>
<body>
<div class="login"><h2>后台登录</h2><form action="token_check.php" method="post"><!-- 将生成的Token作为隐藏字段存储在表单中 --><input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>"><label for="username">用户名:</label><input type="text" name="username" id="username" required><label for="password">密码:</label><input type="password" name="password" id="password" required><input type="submit" value="登录"></form>
</div>
</body>
</html>

2.token_check.php源码

<?php
// 开始会话
session_start();// 获取POST请求中的token,如果不存在则将其设置为空字符串
$token = $_POST['token'] ?? '';// 检查POST请求中的token是否与会话中的token匹配
if ($token !== $_SESSION['token']) {// 如果token不匹配,禁止访问header('HTTP/1.1 403 Forbidden');// 重新生成一个新的token并存储在会话中,以确保安全性$_SESSION['token'] = bin2hex(random_bytes(16));echo 'Access denied'; // 输出拒绝访问的消息exit; // 终止脚本执行
} else {// 如果token匹配,则重新生成一个新的token并存储在会话中,以确保安全性$_SESSION['token'] = bin2hex(random_bytes(16));// 检查用户名和密码是否为管理员的凭证if ($_POST['username'] == 'admin' && $_POST['password'] == '123456') {echo '登录成功!'; // 输出登录成功的消息echo '你是管理员可以访问文件管理页面!'; // 输出管理员特权消息} else {echo '登录失败!'; // 输出登录失败的消息}
}
?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架 原创 QuantML QuantML 2024-04-17 09:53 上海 Content 本文提出了一个名为FTS-Diffusion的新颖生成框架&#xff0c;用于模拟金融时间序列中的不规则和尺度不变模式。这些模式由于其独…

C++三大特性之一:继承

文章目录 前言一、继承方式二、继承类型继承中构造和析构的顺序继承中的内存分配多继承语法(非重点)继承中同名静态成员的处理继承一般在哪里用到进阶&#xff1a;菱形继承和虚拟继承 总结 前言 C三大特性&#xff1a;继承、多态和封装。继承是面向对象编程的一个核心概念&…

Elastic 网络爬虫:为你的网站添加搜索功能

作者&#xff1a;来自 Elastic Lionel Palacin 为了演示如何使用 Elastic 网络爬虫&#xff0c;我们将以一个具体的网站为例&#xff0c;讲解如何在该网站上添加搜索功能。我们将探讨发现网站的方法&#xff0c;并利用 Elastic 网络爬虫提供的功能&#xff0c;以最佳方式准备待…

HTML、CSS常用的vscode插件 +Css reset 和Normalize.css

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍HTML、CSS常用的vscode插件&#x1f34e;1 HTML 标签同步重命名 – Auto Re…

【Java网络编程】网络编程中的基本概念及实现UDP、TCP客户端服务器程序

目录 一、什么是网络编程&#xff1f; 二、网络编程中的基本概念 1. 客户端和服务器 2. 请求和响应 三、Socket套接字 UDP数据报套接字编程 1. DatagramSocket 2. DatagramPacket 3. UDP回显客户端服务器程序 4. UDP字典客户端服务器程序 TCP流套接字编程 1. Serve…

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本&#xff0c;翻教程的时候发现很多SpringBoot2.x版本用的都是springfox&#xff0c;但问题是在SpringBoot3.x版本后&#xff0c;逐渐不支持springfox&#xff0c;强行启动会导致异常&#xff0c;现阶段使用的Springdoc进行替换。 参考…

Java多线程-API

常见API一览 Thread t1 new Thread(() -> {System.out.println("我是线程t1");System.out.println("Hello, World!"); }); t1.start(); // 获取线程名称 getName() // 线程名称默认是Thread-0, Thread-1, ... System.out.println(t1.getName());// 通过…

JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机&#xff0c;这就需要从操作系统中申请一片内存区域。JVM申请到内存之后&#xff0c;会把这个内存划分为几个区域&#xff0c;每个区域都有各自的作用。 一般会把内存划分为四个区域&#xff1a;方法区(也称 "…

【网站项目】党员之家服务系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 说明&#xff1a;本次实验的代码使用verilog编写&#xff0c;文章中为阅读方便&#xff0c…

指针的使用以及运算、二级指针、造成野指针的原因以及解决方法、指针和数组相互使用

第七章&#xff0c;指针的学习 目录 前言 一、指针的概念 二、指针的类型 三、野指针 四、指针的运算 五、指针和数组的关系以及使用 六、指针数组 七、二级指针 总结 前言 这章主要学习的是指针方面的知识&#xff0c;这节只是简单了解一下指针&#xff0c;并不会深…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样&#xff1a; 想要把取到的数据展示成图片&#xff0c;那么你可以这样做&#xff1a; // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

路由器热备份

HSRP HSRP&#xff08;Hot Standby Routing Protocol&#xff09;热备份路由选择协议 HSRP是思科私有的协议&#xff0c;HSRP起到一个双网关热备份的一个目的&#xff0c;不考虑线路问题针对设备而言&#xff0c;一个设备挂了还有另外一台设备&#xff0c;所以双网关也叫双机…

stl_set

文章目录 set1.关联式容器2.键值对3. set3.1 set介绍3.2 set的使用3.2.1 pair3.2.2 find3.2.3 lower_bound 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.3.3 find3.3.4 equal_range3.3.5 erase set 1.关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分…

嵌入式物联网实战开发笔记-乐鑫ESP32芯片功能对比以及功能选型【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ATvRnAZvxkev-PJfd3EAPg?pwd4e33 提取码&#xff1a;4e33 2.1 初识 ESP32 ESP32-S3 是一款低功耗的 MCU 系统级芯片 (SoC)&#xff0c;支持 2.4 GHz Wi-Fi 和低功耗蓝牙 (…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理&#xff0c;最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成&#xff1a;微型工业计算机&#xff0c;显示终端&#xff08;平板电视、LCD&#xff09; 方案需求 …

在Java中使用XxlCrawler时防止被反爬的几种方式

目录 前言 一、常见的反爬措施 1、User-Agent识别 2、Referer识别 3、频率限制 4、IP限制 二、XxlCrawer的应对之道 1、User-Agent应对 2、频率限制 3、IP限制 三、XxlCrawler执行解析 1、XxlCrawler对象 2、启动对象 3、信息爬取线程 总结 前言 众所周知&#x…

【c++】vector的使用

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;我们本篇来到一个新的容器&#xff0c;vector的讲解和使用 目录 1.vector简单介绍2.vector的使用2.1构造函数2.2遍历vector2.3对容量操作2.4vector的增删查改 1.v…

Java测试编程题

题目1 1.创建5个线程对象 线程名设置为&#xff08;Thread01&#xff0c;Thread02&#xff0c;Thread03&#xff0c;Thread04&#xff0c;Thread05&#xff09;使用 代码实现5个线程有序的循环打印&#xff0c;效果如下&#xff1a; Thread01正在打印1 Thread02正在打印2 Threa…

Day60 单调栈 part03

Day60 单调栈 part03 最后一天啦&#xff01;完结撒花~ 84.柱状图中最大的矩形 我的思路&#xff1a; 感觉和接雨水差不多&#xff0c;只需要多考虑一些情况 双指针 lheight 和 rheight 分别是用来存储每个柱子的左边界和右边界的数组。 解答&#xff1a; class Solutio…