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

第二十八天(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.xdnf.cn/news/17300.html

相关文章:

  • LeetCode 分类刷题:209. 长度最小的子数组
  • 目标检测数据集 - 无人机检测数据集下载「包含COCO、YOLO两种格式」
  • 【工具变量】地级市固定资产投资数据(2000-2023年)
  • 开发手札:UnrealEngine和Unity3d坐标系问题
  • Kubelet 探针如何选择 IP:status.PodIP 溯源与“同 Pod 两个 IP“现象解析
  • Go 实用指南:如何执行 Skyline 查询(Pareto 最优点筛选)
  • PID学习笔记1
  • 基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
  • 【洛谷题单】--分支结构(三)
  • DigitalProductId解密算法php调试版piddebug.php
  • 七、《Serverless架构:按毫秒计费的成本革命》--从新浪AI推理平台50%效能提升看无服务器本质
  • vscode/trae 的 settings.json 中配置 latex 的一些记录
  • Android--监听软键盘弹出隐藏事件
  • CamX-骁龙相机修改
  • BPMN编辑器技术实现总结AI时代的工作流编辑器
  • 香港服务器容器网络插件的多节点通信性能基准测试
  • 从灵感枯竭到批量产出:无忧秘书创作平台如何重构内容生产者的工作流程?全环节赋能分析
  • 分布式锁详解及 Spring Boot 实战示例
  • K-means聚类学习:原理、实践与API解析
  • 电子电气架构 --- 48伏电气系统架构
  • Docker Desktop 使用操作指南
  • 微服务的好与坏
  • DAY 39 图像数据与显存
  • 移动端开发中类似腾讯Bugly的产品推荐与比较-5款APP异常最终产品推荐-卓伊凡|bigniu
  • 线程池分析与设计
  • 全面了解selenium
  • [linux] Linux:一条指令更新DDNS
  • Docker容器部署discuz论坛与线上商城
  • Uber的MySQL实践(一)——学习笔记
  • python学智能算法(三十五)|SVM-软边界拉格朗日方程乘子非负性理解