当前位置: 首页 > news >正文

第二十八天(cookiesessiontokeny验证)

#身份验证-Cookie使用

生成cookie的原理图过程:见图

1、客户端向服务器发送HTTP请求。

2、服务器检查请求头中是否包含cookie信息。

3、如果请求头中包含cookie信息,则服务器使用该cookie来识别客户端,否则服务器将生成一个新的cookie。

4、服务器在响应头中设置cookie信息并将其发送回客户端。

5、客户端接收响应并将cookie保存在本地。

6、当客户端发送下一次HTTP请求时,它会将cookie信息附加到请求头中。

7、服务器收到请求并检查cookie的有效性。

8、如果cookie有效,则服务器响应请求。否则,服务器可能会要求客户端重新登录。

$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。

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

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

用phpstudy搭建一个网站测试

登录页面代码 login.php

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>后台登录</title>
    <link rel="stylesheet" href="../styles.css">
</head>
<body>
<div class="login-container">
    <div class="login-box">
        <h2>后台登录</h2>
        <form action="" method="POST">
            <div class="input-group">
                <label for="username">用户名</label>
                <input type="text" id="username" name="username" placeholder="请输入用户名" required>
            </div>
            <div class="input-group">
                <label for="password">密码</label>
                <input type="password" id="password" name="password" placeholder="请输入密码" required>
            </div>
            <button type="submit" class="btn">登录</button>
            <div class="footer">
                <p>忘记密码?</p>
                <p>还没有账号? <a href="#">注册</a></p>
            </div>
        </form>
    </div>
</div>
</body>
</html>
 
<?php
/*
 * 1、连接数据库
 * 2、选择数据库中的表
 * 3、接受提交的用户和密码
 * 4、执行sql语句判断用户密码是否正确
 * */
include 'config.php';
 
$user=@$_POST['username'];
$pass=@$_POST['password'];
$conn=mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$sql="select * from admin where username='$user' and password='$pass';";
 
 
 
$data=mysqli_query($conn,$sql);
if($_SERVER["REQUEST_METHOD"] == "POST") {
    if (mysqli_num_rows($data) > 0) {
        header('Location: index.php');
        exit();
    } else {
        echo "<script>alert('用户或密码错误!')</script>";
    }
}

数据库配置文件 config.php

<?php
 
// 数据库配置信息
define('DB_HOST', 'localhost');     // 数据库主机
define('DB_USER', 'root');          // 数据库用户名
define('DB_PASS', '123456');      // 数据库密码
define('DB_NAME', 'test28'); // 数据库名称
 

管理员页面 index.php

<?php
 
if(@$_COOKIE['username']=='xiaodi' and @$_COOKIE['password']=='xiaodi'){
    echo '恭喜进入后台管理页面!';
    echo '<a href="loginc_out.php">退出</a>';
}else{
    echo "<script>alert('请登录后尝试!')</script>";
}

设置账号密码设置为空,从而使cookie也为空

<?php
setcookie('username', '', time() - 3600, '/');
setcookie('password', '', time() - 3600, '/');
// 跳转到登录页面
header('Location: loginc.php');
exit;
?>

打开 http://192.168.0.101:99/loginc.php cookie 验证的登录页面 没登录前是没有cookie的

输入错误账号密码测试 也没有生成cookie值

输入正确账号密码时

登录页面也有cookie值存在

在同一浏览器下将后台地址复制,新开一个窗口 ,访问后台页面 登录状态依旧在

将浏览器页面关掉,再打开访问地址,登录状态依旧在

当删除浏览器记录时,再访问页面时,cookie值没了,所以cookie是存储在客户端浏览器中的

#身份验证-Session使用

1、客户端向服务器发送HTTP请求。

2、服务器为客户端生成一个唯一的session ID,并将其存储在服务器端的存储器中(如文件、数据库等)。

3、服务器将生成的session ID作为一个cookie发送给客户端。

4、客户端将session ID保存为一个cookie,通常是在本地浏览器中存储。

5、当客户端在发送下一次HTTP请求时,它会将该cookie信息附加到请求头中,以便服务器可以通过该session ID来识别客户端。

6、服务器使用session ID来检索存储在服务器端存储器中的与该客户端相关的session数据,从而在客户端和服务器之间共享数据。

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

$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。

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

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

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

登录页面 logins.php

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>后台登录</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="login-container">
    <div class="login-box">
        <h2>后台登录</h2>
        <form action="" method="POST">
            <div class="input-group">
                <label for="username">用户名</label>
                <input type="text" id="username" name="username" placeholder="请输入用户名" required>
            </div>
            <div class="input-group">
                <label for="password">密码</label>
                <input type="password" id="password" name="password" placeholder="请输入密码" required>
            </div>
            <button type="submit" class="btn">登录</button>
            <div class="footer">
                <p>忘记密码?</p>
                <p>还没有账号? <a href="#">注册</a></p>
            </div>
        </form>
    </div>
</div>
</body>
</html>
 
<?php
/*
 * 1、连接数据库
 * 2、选择数据库中的表
 * 3、接受提交的用户和密码
 * 4、执行sql语句判断用户密码是否正确
 * */
include 'config.php';
 
$user=@$_POST['username'];
$pass=@$_POST['password'];
$conn=mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$sql="select * from admin where username='$user' and password='$pass';";
 
 
 
$data=mysqli_query($conn,$sql);
if($_SERVER["REQUEST_METHOD"] == "POST") {
    //登录成功的逻辑代码
    if (mysqli_num_rows($data) > 0) {
        session_start();
        $_SESSION['username']=$user;
        $_SESSION['password']=$pass;
        header('Location: indexs.php');
        exit();
    } else {
        echo "<script>alert('用户或密码错误!')</script>";
    }
}

 登录后跳转的页面 index.php

<?php
session_start();
if(@$_SESSION['username']=='xiaodi' and @$_SESSION['password']=='xiaodi'){
    echo '恭喜进入后台管理页面!';
    echo '<a href="logins_out.php">退出</a>';
}else{
    echo "<script>alert('请登录后尝试!')</script>";
}

数据库配置文件

<?php
 
// 数据库配置信息
define('DB_HOST', 'localhost');     // 数据库主机
define('DB_USER', 'root');          // 数据库用户名
define('DB_PASS', '654321');      // 数据库密码
define('DB_NAME', 'test28'); // 数据库名称
 

删除session 值

<?php
// 开始会话
session_start();
 
// 清除 SESSION 变量,并销毁会话
session_unset();
session_destroy();
 
// 重定向到登录页面
header('Location: logins.php');
exit;
?>

访问地址 会生成一个保存session的文件

没登录成功之前文件都是空的,这个文件是放在服务器上的

输入正确的账号和密码 session文件就会将内容写进去,

点击退出之后,服务器就会删除掉这个文件

再次访问网址时就会重新生成一个存放session值的文件

#唯一性判断-Token使用

1、生成Token并将其存储在Session

2、生成Token并将其绑定在Cookie触发

3、尝试登录表单中带入Token验证逻辑

4、思考Token安全特性

登录后台页面

<?php
// 生成Token并将其存储在Session
include 'configs.php';
 
 
//1.因为是用的session维持会话,token已经绑定到下面的表单了
//2.token,生成之后直接存到session里,主要是方便重置token,
//每次token随表单提交后都需要重置以保持token的唯一性。
 
$_SESSION['token'] = bin2hex(random_bytes(32));
 
 
?>
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>后台登录</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="login-container">
    <div class="login-box">
        <h2>后台登录</h2>
        <form action="logincheck.php" method="POST">
            <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ; ?>">
            <div class="input-group">
                <label for="username">用户名</label>
                <input type="text" id="username" name="username" placeholder="请输入用户名" required>
            </div>
            <div class="input-group">
                <label for="password">密码</label>
                <input type="password" id="password" name="password" placeholder="请输入密码" required>
            </div>
            <button type="submit" class="btn">登录</button>
            <div class="footer">
                <p>忘记密码?</p>
                <p>还没有账号? <a href="regedit.php">注册</a></p>
            </div>
        </form>
    </div>
</div>
</body>
</html>
 
 

登录页面逻辑处理代码

<?php
include 'configs.php';
$conn=mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$user=@$_POST['username'];
$pass=@$_POST['password'];
$token = @$_POST['token'];
 
$sql="select * from admin where username='$user' and password='$pass';";
$data=mysqli_query($conn,$sql);
 
if($_SERVER["REQUEST_METHOD"] == "POST"){
    if (empty($token) || $token!== $_SESSION['token']) {
        echo '<script>alert("Token 无效!")</script>';
        exit();
    }
    //判断用户登录成功
    if(mysqli_num_rows($data) > 0){
        session_start();
        $_SESSION['username']=$user;
        $_SESSION['password']=$pass;
        $_SESSION['token'] = bin2hex(random_bytes(32));
        header('Location: indexst.php');
        exit();
    }else{
        //判断用户登录失败
        echo '<script>alert("登录失败!")</script>';
    }
}
 
 
?>

数据库配置文件

<?php
session_start();
 
// 生成 CSRF Token(如果没有)
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32)); // 生成一个 32 字节的 token
}
 
// 数据库配置信息
define('DB_HOST', 'localhost');     // 数据库主机
define('DB_USER', 'root');          // 数据库用户名
define('DB_PASS', '654321');      // 数据库密码
define('DB_NAME', 'phpstudy'); // 数据库名称
 
 
?>

后台页面

 
 
<?php
 
 
session_start();
 
if(@$_SESSION['username']=='xiaodi' && @$_SESSION['password']=='xiaodi'){
    echo "恭喜进入后台管理页面!";
    echo '<a href="loginst_out.php">退出</a>';
}else{
    echo '<script>alert("请登录!")</script>';
    //header('Location: loginc.php');
}
 
?>

删除token 通过将session置空 使得token验证失败

<?php
 
// 开始会话
session_start();
 
// 清除 SESSION 变量,并销毁会话
session_unset();
session_destroy();
 
// 重定向到登录页面
header('Location: loginst.php');
exit;
 

每次刷新时都会生成新的token值,代码中只要有判断token值是否和本次访问的一样,就会使得无法对其进行爆破 方框内为token值

token验证:刷新页面时表单中会存在token值和服务器上的session保存token值,每次刷新时存储的值就会改变,提交数据时,通过对比表单中的token值和session中的token值,来确保token值的正确性

当相对用户账号密码进行爆破时,每次提交数据。token值都会发生变化,使得无法进入正常验证账号密码逻辑,就先被token验证给挡了

burp中开启拦截,将数据包拦截下来后,将账号密码改成正确的,然后将数据放出去

可已成进入

这里因为代码不是很完善,所以token值在被发包时不会改变,当登录成功时,会发生改变,因为登录成功时会刷新token值

测试时,用repeater发包后,只要密码正确就回返回302,只有第一次账号密码正确时有效,再发包时,因为token值的刷新,导致无法验证

具体安全知识点:

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

1、存储位置不同:

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

2、安全性不同:

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

3、存储容量不同:

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

4、生命周期不同:

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

5、访问方式不同:

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

6、使用场景不同:

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

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

-在Web应用程序中,使用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来传递用户身份信息,比较麻烦。

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

http://www.lryc.cn/news/615342.html

相关文章:

  • 李宏毅深度学习教程 第16-18章 终身学习+网络压缩+可解释性人工智能
  • STM32学习笔记6-TIM-2输出比较功能
  • 《汇编语言:基于X86处理器》第12章 复习题和练习
  • [每周一更]-(第155期):深入Go反射机制:架构师视角下的动态力量与工程智慧
  • 元宇宙技术如何改变社交方式?
  • (第三篇)spring cloud之Zookeeper注册中心
  • Go 实用指南:如何执行 Skyline 查询(Pareto 最优点筛选)
  • 图片拆分工具,自定义宫格切割
  • 在Spring Boot项目中如何动态切换数据源、数据库?
  • java -jar xxx.jar 提示xxx.jar中没有主清单属性报错解决方案
  • 【Git】Visual Studio 实现合并分支
  • Alibaba Cloud Linux 3 安装 git
  • DigitalProductId解密算法php调试版piddebug.php
  • n8n飞书webhook配置(飞书机器人、飞书bot、feishu bot)Crypto节点、js timestamp代码、Crypto node
  • AG32cpld实现一个UartTx“外设”
  • Kafka服务端NIO操作原理解析(二)
  • Arm Development Studio 安全通告:CVE-2025-7427
  • 人脸情绪检测数据集-9,400 张图片 智能客服系统 在线教育平台 心理健康监测 人机交互优化 市场研究与广告 安全监控系统
  • 【面试题】cookie和session 的区别
  • 【26】C#实战篇—— 多个线程函数对同一个 Excel 文件进行写操作引起的文件冲突问题,解决方法
  • Playwright C# 自动登录并上传 Excel 文件 的可运行示例
  • Irix HDR Pro:专业级 HDR 图像处理软件
  • Docker部署whisper转写模型
  • Java中Lambda表达式的常见用法和解析:从入门到实战
  • C/C++基础详解(二)
  • 【51单片机4按键启动停止向上向下流水灯】2022-10-26
  • 本文章分享一个本地录音和实时传输录音给app的功能(杰理)
  • 【c++】探秘Loop机制:C++中优雅的双向数据交互模式
  • Ubuntu下安全彻底删除后端服务完整指南
  • 网络原理-初识