前言
以开发者的角度去理解用户验证机制。
cookie
定义:cookie就是一种出现在前端的,一种身份验证机制 (举例就类似于 你登陆一次qq之后下次就是不用重新登录了 这是为什么呢 这其实就是 cookie 产生之后就会储存(这个需要我们定义储存时间) 既然这个时间是有延迟的那就可能被捕捉然后被利用 就是比如你不小心点击了一个请求伪造网站 cookie 被获取了 然后你的勾选了(记住我的账号)就会被 获取信息,但是这个时候要是再有个验证那就不会让你丢失账号数据了 这个我们叫做唯一性 那这个让你账号保持唯一性的东西 呢我们就叫做token 这里就知道token让我们的账户或者是客户端只认识我们 )
那就让我们打开 VScode 开始敲吧
这边我们为了便利先写一个 php连接数据库的 语句,然后要被使用的话就直接调用就可以了,
代码如下 (代码的意思注释我上个文章都有)
<?php
$dbip="localhost";
$dbuser="root";
$dbpasswd="123456";
$dbname="demo01"
$con=mysqi_connect("localhost","root","123456","demo01")
?>
为什么创建这个文件 就是后边的一些数据库的执行 都需要这个$con为前提 msqli_query($con,'数据库操作命令')
然后我们创建3个 php 分别为 admin-c.php index-c.php logout-c.php
进入admin-c 复制一下下边这个AI写的登录页面
<!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>
这里吧有几个用户输入值是需要进行 化为参数 进行后期传参的
第一个就是username 第二个是 password
这里先说下 cookie的运作过程 1、接收账号密码 2、判断 3、储存 4、根据判断进行页面跳转
那我们就先传参吧
<?php
include 'config.php'; //先引用 连接文件
$user=$_post['username'];
$passwd=$_post['password']; //把用户输入的账号密码 定义为参数 再进行 post 传输
?>
第二步判断
//接上
<?php //登录文件
include 'config.php';
//接收
$user=$_POST['username'];
$passwd=$_POST['password'];
// 因为判断是从数据库中的信息 进行判断的 所以我们需要先把账号密码从数据库拿出来
$date-msqli_query($con,'select * from admin where name-'$user' and password='$passwd';');
//数据取出来之后 再进行 进行判断看看查到内容没有 如果没有内容说明 用户输入的账号密码不对 然后给他提示 用 msqli_num_row (这个语句可以获取输出结果的行数) 去判断 如果对了就去执行下一步,不对就让他回退
if($_SEVER['REQUEST_METHOD']=='POST') //
{if(msqli_num_row($date) !=0 ){
setcookie ('username','$user',time()+3600,'/'); //建立cookie的语句 第一位就是用户输入的数据 第二位就是给数据赋值, time()+3600 表示 默认的存活时间 单位是秒
setcookie('password','$passqd',time()+3600,'/');
header('Location: index-c.php'); //这个表示重定向 到index-c.php 这个一会说这个其实就是我们的一会登录之后的页面
}else{ echo "<script>alert('登录失败')</script>";
}
}
但是你要是试试了这个代码你就会发现 哎呀你妹的 什么情况啊我一登陆 就给我弹窗失败啊
这个的原因就是这个判断没有什么限制 所以我们一进去他就会判断 那我们什么也没干还当然报错了 这个的解决就是 我们创建一个逻辑让我们点击登录才显示就是在 if上边再加一个 if 判断传输方式 因为登录的按钮就是以post传输。
因为说到了login定向到 index-c 但是在这个里边其实还要进行一次判断(上边这个是数据库和php的判断)这个是两个php跳转的判断 实际上就是为了让cookie一致
index-c 的判断
<?php if($_COOKIE['username']=='admin' && $_COOKIE['password']=='123456') //判断上个页面传来的cookie是不是和真实的cookie相同 这个其实我建议 在上个页面定义一个function 就是从数据库拿出 user,passwd那一块 然后在这直接调用 用数据库的值来对比
{
}else{
header('Location:admin-c.php') //重定向到admin-c
}
?>
<!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>
运行一下吧
这边就会发现 用户名admin 可以网页检测看看cookie 就会有admin 123456
那就展现个cookie的漏洞 : 就是我们上边说的cookie被窃取了 攻击者就可以直接用我们的cookie登录
现在我们换个 浏览器(浏览器其实就是客户端) 登录一下 发现
然后就是cookie清除系统
我们知道 当我们退出的时候 cookie就是清空 下次就得我们 重新输入密码
打开 logout 开始写吧
//两种方法
//1、 赋值为空型
setcookie("username","", time()+0,"/"); //给与username 为空而让cookie清空 '/' 表示作用于本窗口
setcookie("password","", time()+0,"/"); //
header("Location:admin-c.php");
//2、函数去cookie
// unset($_COOKIE["username"]);
// unset($_COOKIE["password"]);
// header("Loaction:admin-c.php");
运行一下
那cookie这一块就完事了 源码:
Session 的建立 这两个的区别在我们完成这个实例之后再说
session的单词意思就是会话,那我们说悄悄话不能让别人知道吧 那这个就是在服务器端的
其实是在服务器的
也是创建3个 admin-s,index-s,logout-s
也是先弄admin 前边的一样的就直接粘贴上 , 直接到cookie加密那里
session_start(); //只要是后边涉及到 session就得开启会话 记住不开启会话就无法进行 session
$_SESSION['username']=$user; //不设置时间 表示他没有使用后延迟的特性(你开着这个网站 再玩会游戏就发现 过了一会就自动退出了) 你要是想伪造session就得 进入服务器 但是你都进入服务器了 还要这个有个鸟用啊
$_SESSION['password']=$passwd;
index 页面验证session值
session_start();
if($_SESSION['username']=='admin' && $_SESSION['password']== '123456') {
} else { header('Location:admin-s.php');} //进行验证 这个和cookie差不多
那我们进行运行演示一下 (这里有个技巧就是如果你 跳转不了其他页面 我建议 用phpstudy去 建立一个本地域名的 网站) 这个演示就得用到这个
登录进去 然后 我们去为了验证这个session和服务器的关系
打开看看
是我们的账号密码 那这又个和cookie的区别其实就是成本 这个虽然登录失败不会产生但是 也会极大的占用服务器资源
这里还涉及一个威胁 就是加入 我们捉到的用户正在和当前的服务器进行数据交互 我们可以用 正在使用的 sessionid 去登录(置换session id)
session的清除
//session的清除和别的不太一样
sesion_start();
//session_unset(); //删除会话的所有变量
session_destory(); //销毁数据
header('Location:admin-s.php')
cookie session的区别
#具体安全知识点:
-Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制
1、存储位置不同:
Cookie是存储在客户端(浏览器)上的,而Session是存储在服务器端的。(只要能对目标服务器进行渗透成功就不需要session)
2、安全性不同:
Cookie存储在客户端上,可能会被黑客利用窃取信息,而Session存储在服务器上,更加安全。
3、存储容量不同:
Cookie的存储容量有限,一般为4KB,而Session的存储容量理论上没有限制,取决于服务器的硬件和配置。
4、生命周期不同:
Cookie可以设置过期时间,即便关闭浏览器或者重新打开电脑,Cookie仍然存在,直到过期或者被删除。而Session一般默认在浏览器关闭后就会过期。 会话终端 就是你挂着和服务器的交流 一段时间之后你就会发现 你需要重新登录了
5、访问方式不同:
Cookie可以通过JavaScript访问,而Session只能在服务器端进行访问。
6、使用场景不同:
Cookie一般用于存储小型的数据,如用户的用户名和密码等信息。而Session一般用于存储大型的数据,如购物车、登录状态等信息。
总之,Cookie和Session都有各自的优缺点,选择使用哪一种方式,取决于具体的应用场景和需求。一般来说,如果需要存储敏感信息或者数据较大,建议使用Session;如果只需要存储少量的数据,并且需要在客户端进行访问,可以选择使用Cookie。
token的设置
发明token的真是个天才 token 的特点就是 可以结合 cookie session进行双重验证
建立2个文件 token(前端) token-check(前端后台 或者说是前一个点击之后的)
这里要用到session 前边我们提到了token的唯一性 就是他是唯一的(通过一个随机函数产生的) 所以为了跳转 我们需要把这个产生的token 先存起来 为什么不用cookie存,其实也需要用cookie 而session 就是比较安全然后与后边我们在html页面插入的token(这个是存了cookie里的)一一对应
<?php
session_start();
$token=bin2hex(random_bytes(16)); //产生token 是个32进制的数据
// 这边我们可以打印一下
echo '$token';
//然后把token存储在 session cookie中去
$_SESSION['token']=$token; //储存的目的就是为了和我们跳转的页面进行 一次验证
setcookie('token',$token,time()+ 3600,'/'); //这个在前端产生也是为了防爆破 就是每登陆一次 就会产生一个token在cookie里
?>
演示一下
这个就是把token放在 cookie的目的 除了防爆破 其实还放着 跨站请求伪造 :别人把一个更改数据的请求以url的形式传给你 然后你一点哎呀我去 我的密码怎么被改了 但是有了这个cookie token 联动 就是你点它的请求的时候 就发现你直接推到了主页 并显示了 修改失败
这里还有个就是token需要给到html中
写这个的目的就是为了把token化参 和后边的后台验证 对比一下
这边化参数的话 建议是用 cookie['token']传输
直接看后台验证
这里的session token就是一开始藏起来的最初是的token 然后cookie token 就是我们哪个html定义传过来的 一对比是相同的说明找对了 判断完token在判断账号密码(session 双重验证)
源码:
还有个点忘了说 就是action 把这个界面呈现给谁
运行一下
session 储存了token
源码文件: 蓝奏云优享版