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

第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.mzph.cn/news/648642.shtml

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

相关文章

10 个值得分享给你前端低代码项目

今天来分享 10 个优秀的前端低代码项目&#xff01;企业级低代码快速开发平台&#xff0c;包含页面可视化配置、自定义表单、自定义报表、权限管理脚手架应用、前后端代码自动生成&#xff1b;主要特点是低代码开发&#xff0c;可实现复杂CRUD功能仅编写数据模型就能完成前后端…

unity代码创建animationclip,并对指定帧进行像素偏移

这段代码使用菜单按钮的方式&#xff0c;在Unity编辑器中创建AnimationClip&#xff0c;并对每一帧进行像素偏移。在Unity编辑器中&#xff0c;在Project面板中选择一个纹理&#xff0c;然后通过右键菜单选择Assets > Create > AnimationClip With Pixel Offset&#xff…

在CSS中如何寻找第一个元素

ul li:first-child {color: red; } 在CSS中&#xff0c;要找到第一个元素&#xff0c;可以使用:first-child选择器。该选择器可以用于选择父元素下的第一个子元素。例如&#xff0c;要选择一个ul元素下的第一个li元素&#xff0c;可以使用下面的代码&#xff1a; 上面的代码将…

扫雷游戏 bevy 实践(bevy 0.12)-1

经典的扫雷游戏 bevy 实践&#xff08;bevy 0.12&#xff09; 网上大多是0.6的 但愿大家能够摸索着 上手 参考资料&#xff1a; Bevy Minesweeper: Introduction - DEV Community &#xff08;原始教程&#xff0c;0.6版本&#xff09; https://github.com/leonidv/bevy-m…

在线教育App、H5、微信小程序项目

大型多端项目&#xff0c;uni-app开发 一、首页 二、课程页 以点击购买&#xff0c;购买后可以看到课程内容 种课程音频、视频等&#xff0c;以及专栏&#xff0c;都可以购买后观看 三、电子书 订阅成功后&#xff0c;就可以观看电子书了 选择章节 直播模块&#xff1a; 订阅…

云服务ECS扩容示例

原文可参考&#xff1a;【在Linux操作系统内扩容分区和文件系统_云服务器 ECS(ECS)-阿里云帮助中心】 示例1&#xff1a;扩容MBR分区和ext4文件系统 设备名&#xff1a;/dev/vda&#xff08;系统盘&#xff09;1个分区&#xff1a;/dev/vda1文件系统类型&#xff1a;ext4操作…

Linux 一键部署influxd2-telegraf 二进制方式

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

零基础学习数学建模——(四)备战美赛

本篇博客将讲解如何备战美赛。 什么是美赛 美赛&#xff0c;全称是美国大学生数学建模竞赛&#xff08;MCM/ICM&#xff09;&#xff0c;由美国数学及其应用联合会主办&#xff0c;是最高的国际性数学建模竞赛&#xff0c;也是世界范围内最具影响力的数学建模竞赛。 赛题内容…

CuteHttpFileServer

需求 最近行政同时需要做文件共享&#xff0c;使用windows上的文件共享有些问题&#xff0c;ftp也是有问题&#xff0c;同时需要身份验证功能&#xff0c;找了很久&#xff0c;发现CuteHttpFileServer 这个文件服务器&#xff0c;可以解决这个需求&#xff0c;中间过程中也写过…

生产问题复盘!Swap对GC的影响

Swap 1. 什么是Swap swap 是把一块磁盘空间或者一个本地文件当做内存来使用。可用内存无法满足内存分配请求的时候&#xff0c;把不常用的内存数据存储到磁盘&#xff0c;并在内存中释放这部分内存。当进程再次访问这部分内存的时候&#xff0c;再读取到内存中来。 2. 为什么…

使用Gin框架,快速开发高效的Go Web应用程序

推荐 海鲸AI-GPT4.0国内站点&#xff1a;https://www.atalk-ai.com 前言 在当今的软件开发领域&#xff0c;Go语言以其简洁的语法和出色的性能逐渐成为开发者们的新宠。而Gin框架&#xff0c;则是Go语言中最受欢迎的Web框架之一&#xff0c;它以高性能和易用性著称。本文将带你…

前端常用的时间格式处理

import { fillZero } from /utils/utils export const shortcuts [[最近一周, 7],[最近一个月, 30],[最近三个月, 90],[最近半年, 180],[最近一年, 365] ]/*** dateParams 获取时间对象 * param {Number} value 时间戳*/ export const dateParams (value) > {const …

详讲api网关之kong的基本概念及安装和使用(一)

什么是api网关 前面我们聊过sentinel&#xff0c;用来限流熔断和降级&#xff0c;如果你只有一个服务&#xff0c;用sentinel自然没有问题&#xff0c;但是如果是有多个服务&#xff0c;特别是微服务的兴起&#xff0c;那么每个服务都使用sentinel就给系统维护带来麻烦。那么网…

计数指针:shared_ptr (共享指针)与函数 笔记

推荐B站视频&#xff1a; 4.shared_ptr计数指针_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p4&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 5.shared_ptr与函数_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p5&vd_sourcea…

11Docker数据持久化

Docker数据持久化 容器中数据持久化主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;数据卷容器&#xff08;Data Volumes Dontainers&#xff09; 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;可以绕过UFS&#xff08;Unix F…

YOLOV5目标检测---labelimg图片标注工具(1)

前言&#xff1a;在使用YOLO训练自己模型的时候首先要学会对数据进行处理&#xff0c;这里介绍一个常用的本地打标签工具labelimg&#xff0c;如果不想按照的话也可以使用在线标签工具&#xff0c;因为害怕数据泄露&#xff0c;所以本人一直使用的是本地工具进行打标签。在线标…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

ppt作品展示能用二维码吗?文件二维码内容可替换怎么做?

当我们需要将自己的作品或者内容做成ppt文件之后&#xff0c;用二维码的方式来做展示&#xff0c;而且生成二维码还可以在图案不变的情况下&#xff0c;能够修改或者替换文件内容&#xff0c;实现二维码的长期使用。在遇到这种要求时&#xff0c;如何生成这种类型的二维码图片呢…

扫雷游戏——数组和函数实现

扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷可以排查雷如果位置不是雷&#xff0c;就显⽰周围有⼏个雷如果位置是雷&#xff0c;就炸死游戏结束把除10个雷之外的所有⾮雷都找出来&…

CSS--样式穿透

样式穿透具体可分为css、less以及scss&#xff0c;语法不同&#xff0c;具体语法如下所示。 css样式穿透&#xff1a; <style scoped>父元素 >>> 子元素 {color: red;} </style> less样式穿透&#xff1a; <style lang"less" scoped>父…