[BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)

news2024/12/4 16:34:26

第15天

名词解释

Cookie 是小型的文本文件,由网站发送到用户的浏览器,并存储在用户的设备上。Cookie 通常用于存储识别用户的信息,例如用户偏好、登录状态等。每当用户再次访问同一网站时,浏览器会将 Cookie 发送回服务器,以便服务器识别用户。

特点:

  1. 存储在用户的浏览器中。
  2. 有大小限制(通常为 4KB)。
  3. 有过期时间,可以是浏览器会话结束时或设置的未来时间点。
  4. 可以设置为仅在 HTTPS 连接上发送等安全选项。

Session 是服务器端用来维护用户状态的一种机制。当用户访问应用时,服务器创建一个会话,并为这个会话分配一个唯一的标识符(通常称为 Session ID)。这个 Session ID 通常通过 Cookie 发送到用户的浏览器,但也可以通过其他方式传输。

特点:

  1. 存储在服务器上。
  2. 存储容量比 Cookie 大得多。
  3. 可以存储复杂的用户数据结构。
  4. 持续时间通常取决于用户的活动(如登录状态),和服务器的配置。

Cookie 与 Session 的区别

存储位置:Cookie 存储在客户端(浏览器),而 Session 存储在服务器端。

安全性:由于 Cookie 存储在客户端,因此比较容易被篡改或窃取。Session 更安全,因为数据存储在服务器上。

存储容量:Cookie 的数据容量有限(约为 4KB),Session 可以存储更多数据。

生命周期:Cookie 可以设置较长的有效期,即使浏览器关闭后依然存在。Session 的生命周期通常随着用户的会话结束(如用户退出登录或会话超时)而结束。

性能影响:每次 HTTP 请求都会携带 Cookie,可能会影响性能。Session 数据不会随每个请求发送,但会占用服务器内存。

用途:Cookie 常用于存储用户偏好或跟踪用户行为。Session 主要用于存储用户特定的信息,如认证信息或购物车内容。

总结
简而言之,Cookie 是客户端上存储的小型数据片段,主要用于持久化用户数据。Session 是服务器端的存储机制,用于维护用户的状态和信息。在 Web 应用程序中,它们通常一起使用以提供连贯的用户体验和保持用户的登录状态。

简单的登陆页面

这一部分的主要内容是设计一个比较简单的登陆页面,服务器接受表单数据后向数据库查询对应用户,如果用户名和密码均正确那么显示登录成功,不正确显示登录失败。

代码展示:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    include '../db_config.php';
    // 检查连接
    $user = $_POST['username'];
    $pass = $_POST['password'];

    // TODO: 此处应有更强的安全措施,如密码加密和预处理语句
    $sql = "SELECT id FROM users_login WHERE name = '$user' AND password = '$pass'";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        echo "登录成功";
        // 登录成功的操作
    } else {
        echo "用户名或密码错误";
    }

    $conn->close();
}

此处数据库保存的是明文密码,查询的也是明文密码,一般来说是需要将密码进行处理才会存储到服务器的。

网页效果

在这里插入图片描述
有些网站在登陆成功后可能会跳转到新的页面(而这些页面一般都是登录之后才能访问的),如果网站不作限制,我们直接访问新页面就可以绕过登录限制,以未登录的状态进行访问,虽然网站也可以对用户跳转的上一个链接进行验证,但如果网站页面很多,也不太可能一个个的设置,因此Cookie和Session就比较方便了。

添加Cookie

代码展示:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    include '../db_config.php';
    // 检查连接
    $user = $_POST['username'];
    $pass = $_POST['password'];

    // TODO: 此处应有更强的安全措施,如密码加密和预处理语句
    $sql = "SELECT id FROM users_login WHERE name = '$user' AND password = '$pass'";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        echo "登录成功";
        setcookie("loggedin", "true", time() + 3600, "/"); // 有效期一小时
        setcookie("username", $user, time() + 3600, "/"); // 同时保存用户名

    } else {
        echo "用户名或密码错误";
    }

    $conn->close();
}

主要添加了setcookie("loggedin", "true", time() + 3600, "/");setcookie("username", $user, time() + 3600, "/"); 这两句代码用于设置Cookie,然后在其他页面通过if(isset($_COOKIE["loggedin"]) && $_COOKIE["loggedin"] === "true")这行简单的代码就可以验证Cookie了。

漏洞分析

Cookie修改:
有些网站设置Cookie比较简陋,虽然登陆成功会设置Cookie,但验证的时候只验证用户浏览器发来的Cookie的某个值是否为空,不为空则通过,为空则说明没有登陆成功。但是用户可以自己修改Cookie的值来达到要求(这通常在知道网站Cookie验证源码已知的情况下比较有用),如果网站只要求设置了值,那么我们对应的随便设置一个值就可以通过(只要不为空),如果网站要求等于特定值,那我们可能就需要构造这个特定值才能通过验证了。

Cookie盗取:
由于XSS攻击可以在用户浏览器上执行js代码,也就可以直接获取到存储在用户自己浏览器上的某个网站的登录Cookie,攻击者再利用这个获取到的Cookie就可以直接登录对应网站了。

添加Session

代码展示:

<?php
session_start(); // 在使用 Session 之前必须首先启动 Session
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    include '../db_config.php';
    // 检查连接
    $user = $_POST['username'];
    $pass = $_POST['password'];

    // TODO: 此处应有更强的安全措施,如密码加密和预处理语句
    $sql = "SELECT id FROM users_login WHERE name = '$user' AND password = '$pass'";

    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        echo "登录成功";
//      setcookie("loggedin", "true", time() + 3600, "/"); // 有效期一小时
//      setcookie("username", $user, time() + 3600, "/"); // 同时保存用户名
        $_SESSION["loggedin"] = true;
        $_SESSION["username"] = $user;
    } else {
        echo "用户名或密码错误";
    }

    $conn->close();
}
?>

在使用Session后,用户浏览器向服务器发送的Cookie中会包含Session ID,用于标识用户,这个值一般来说比较难获取(无法爆破)。Session随着用户关闭浏览器而结束,因此很难有固定的Session ID。
在这里插入图片描述

漏洞分析

虽然Session ID很难伪造,但我们依然可以劫取Session,只要我们想办法获得Session ID并且Session未失效,那么依然可以伪装用户登陆网站。

登录漏洞

万能密码:
由于我们的"SELECT id FROM users_login WHERE name = '$user' AND password = '$pass'";未对user和pass变量过滤,因此存在SQL上的漏洞,比如我们在用户名中输入' or 1 = 1 #,上面这行代码会判断or两端一假一真,合起来就是真,然后#注释掉查询密码的语句,因此无论输入的什么密码都能正确查询登陆成功,所以被称作万能密码。
在这里插入图片描述
验证码:
如果网站没有用户根据图片输入验证码(或其他验证码方式),那么很可能被攻击者用来进行爆破攻击,但如果有验证码就可以很好的限制爆破。

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

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

相关文章

mysql8版本批量造4000个数据SQL

需求: 测试工作中修改单需要构造单元下4000个组合的数据,写个博客来记录,其他类似的可以举一反三。 具体sql: 实现1个产品1个单元下插入4000个组合数据 思路: 在MySQL 8中实现循环插入4000条具有不同主键的记录,可以使用AUTO_INCREMENT和循环插入的方式。下面是一个…

5.列表选择弹窗(BottomListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7、MAUI 从底部弹出的列表选择弹窗。 1.布局 <?xml version"1.0" encoding"utf-8" ?> <toolkit:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns…

Sublime的安装及汉化

sublime安装 官网sublime 点击Windows 下载参考&#xff1a;傻瓜式下载 sublime汉化 1&#xff09;安装 Sublime Text 4 成功后&#xff0c;点击菜单 【Tools】 -> 【Install Package Control】&#xff1b; 注意&#xff1a;安装包控件需要等待一会&#xff0c;点击可…

GitBook可以搭建知识库吗?有无其他更好更方便的?

在一个现代化的企业中&#xff0c;知识是一项宝贵的资产。拥有一个完善的企业知识库&#xff0c;不仅可以加速员工的学习和成长&#xff0c;还能提高工作效率和团队协作能力。然而&#xff0c;随着企业不断发展和扩大规模&#xff0c;知识库的构建和管理变得更加复杂和耗时。 |…

React中使用LazyBuilder实现页面懒加载方法一

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

[Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法

一、vim及其三种模式的简单介绍 Vim是一个类似于Vi的文本编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面,如多级撤销、多窗口操作、崩溃后也可以恢复、增加了稳定性、关键字自动补全、上下文自动补全等…

如何使用 WebRTC 与 Kurento 建立视频会议 App

本文作者 WebRTC Ventures 工程师。在 RTC 2018 实时互联网大会上&#xff0c;WebRTC Ventures 的资深软件工程师&#xff0c;将围绕 WebRTC 开发带来经验分享。欢迎访问RTC 开发者社区&#xff0c;与更多WebRTC开发者交流经验。 了解 WebRTC 如何工作的一种简单方式是通过学习…

SpringBoot的默认组件扫描

本篇博客主要探究&#xff1a;为什么SpringBoot项目中我们没有配置组件扫描的包&#xff0c;为什么它会默认扫描启动类所在的包&#xff1f; 一、访问与启动类所在同一包下的接口 我们先来看一个简单的接口&#xff1a; 我们可以观察到&#xff0c;HelloController这个类处在…

如何做接口测试?看完这个图让你清楚了解接口测试

01 通用的项目架构 02 什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff0c;不同的请求类型&#xff08;GET、POST&#xff09;&#xff0c;不同的参数&#xff0c;来执行不同的业务逻辑…

大数据学习之Redis、从零基础到入门(二)

二、Redis安装配置 1. VMWare本地虚拟机 VMWare准备的为64位 查看自己的VMWare是32位还是64位 getconf LONG_BIT 2. Redis的安装 2.1 系统选择 选择Linux系统 2.2 Linux版安装 2.2.1 Linux环境安装Redis必须先具备gcc编译环境 ①什么是gcc gcc是linux下的一个编译程序&…

应急响应-Windows-进程排查

进程&#xff08;process&#xff09;是计算机中的程序关于某数据集合上的一次运动活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结果的基础。在早期面向进程结构中&#xff0c;进程是线程的容器。无论是在Windows系统还是Linux系统中&#xff0c…

Vue 3.0中Treeshaking特性(详细解析)

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除…

vue项目中如何使用SVG图标

IconFont使用的不足&#xff1a;图标添加、修改、删除以后在线链接需要更新离线资源需要重新下载项目代码需要同步更新。 在项目不断更新和迭代的过程中&#xff0c;图标的增减变化还没有稳定的情况下&#xff0c;开发人员的工作效率会明显下降。 那么有没有一个图标应用方式…

利用大数据靶向肿瘤细胞的基因突变

在亚利桑那健康科学大学&#xff0c;研究人员正在应用大量数据&#xff0c;试图更多地了解这种突变、其变异以及任何可能有助于他们治疗患者的相关因素。 癌症的潜在原因很多&#xff0c;从食物和环境到创伤和感染。在遗传学方面&#xff0c;研究人员发现&#xff0c;有一种基因…

Unity中实现合理塔防寻路机制

前言 在一款TD游戏中,最重要的单位就两大类:防御塔(Tower)和敌人单位(Enemy)。在处理敌人单位的AI行为时,最基本也是最重要的就是自动寻路。在各式TD游戏中,防御塔的攻击方式以及敌人单位的Buff机制往往是能做出差异化的地方;而在寻路问题上,几乎是没有差异的,面对…

Springboot注解@Aspect(一)之@Aspect 作用和Aop关系详解

目录 Aspect的使用 配置 作用 通知相关的注解 例子 结果&#xff1a; Aspect作用和Spring Aop关系 示例 标签表达式 Aspect的使用 配置 要启用 Spring AOP 和 Aspect 注解&#xff0c;需要在 Spring 配置中启用 AspectJ 自动代理&#xff0c;但是在 Spring Boot 中&a…

shell脚本-函数及数组

一.函数 1.函数的作用 语句块定义成函数约等于别名&#xff0c;定义函数&#xff0c;再引用函数 封装的可重复利用的具有特定功能的代码 2.函数的基本格式 法一&#xff1a; [function] 函数名 {命令序列[return x] #使用return或者exit可以显式的结束函数 }法二&…

对比一下Confluence,其实HelpLook搭建知识库也不错

随着越来越多的企业转向远程工作和分散团队&#xff0c;寻找一种适合团队协作和知识共享的工具变得更为重要。HelpLook和Confluence是两个我认为比较相似的知识库软件&#xff0c;它们都提供了丰富的功能和卓越的用户体验。接下来就对HelpLook和Confluence进行详细的介绍和对比…

【Spring 篇】MyBatis DAO层实现:数据之舞的精灵

欢迎来到MyBatis DAO层的神奇世界&#xff0c;这里将为你揭示DAO层的奥秘&#xff0c;让你成为数据之舞的精灵。无论你是初学者还是想要深入了解DAO层的开发者&#xff0c;这篇博客将引导你踏入MyBatis DAO层的王国&#xff0c;一探其中的精彩。 舞台1&#xff1a;DAO层的角色…

【大数据面试题】HBase面试题附答案

目录 1.介绍下HBase 2.HBase优缺点 3.介绍下的HBase的架构 4.HBase的读写缓存 5.在删除HBase中的一个数据的时候&#xff0c;它是立马就把数据删除掉了吗? 6.HBase中的二级索引 7.HBase的RegionServer宕机以后怎么恢复的? 8.HBase的一个region由哪些东西组成? 9.…