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

news/2024/7/24 14:38:23/

第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.ppmy.cn/news/1332979.html

相关文章

C# CefSharp 输入内容,点击按钮,并且滑动。

前言 帮别人敲了个Demo,抱试一试心态&#xff0c;居然成功了&#xff0c;可以用。给小伙伴们看看效果。 遇到问题 1&#xff0c;input输入value失败&#xff0c;里面要套了个事件&#xff0c;再变换输入value。后来用浏览器开发工具&#xff0c;研究js代码&#xff0c;太难了&a…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-11 HTML5 表单验证

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 表单验证</title> </head><body> <form action"#" method"get" novalidate>请输入您的邮箱:<input type&q…

Tensorflow2.0笔记 - tensor的合并和分割

主要记录concat,stack,unstack和split相关操作的作用 import tensorflow as tf import numpy as nptf.__version__#concat对某个维度进行连接 #假设下面的tensor0和tensor1分别表示4个班级35名同学的8门成绩和两个班级35个同学8门成绩 tensor0 tf.ones([4,35,8]) tensor1 tf…

01 Redis的特性+下载安装启动

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…

Kubernetes/k8s之安全机制:

k8s当中的安全机制 核心是分布式集群管理工具&#xff0c;容器编排&#xff0c;安全机制核心是:API SERVER作为整个集群内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕api server开设计的。 请求api资源 1、认证 2、鉴权 3、准入机制 三…

Redis客户端之Redisson(二)Redisson分布式锁

一、原理&#xff1a; Redisson并没有通过setNx命令来实现加锁&#xff0c;而是基于 Redis 看⻔狗机制&#xff0c;自己实现了一套分布式锁逻辑。 1、加锁机制&#xff1a; 二、使用方法&#xff1a;

ZK监控方法以及核心指标

文章目录 1. 监控指标采集1.1 zk版本高于3.6.0监控指标采集1.2 zk版本低于3.6.0监控指标采集1.3 配置promethues采集和大盘 2. 核心告警指标3. 参考文章 探讨zk的监控数据采集方式以及需要关注的核心指标&#xff0c;便于日常生产进行监控和巡检。 1. 监控指标采集 3.6.0 版本…

SpringBoot整理-依赖注入

Spring Boot, 继承自 Spring 框架,提供了强大的依赖注入(Dependency Injection, DI)功能。这是一种编程技术,允许软件组件动态地接收它们的依赖项,而无需自己创建或查找它们。在 Spring Boot 中,这通常通过注解(Annotations)实现,使得应用的配置和依赖管理更加简洁和直…

寒假刷题第15天

PTA甲级 1101 Quick Sort 求partition的位置&#xff0c;partition位置一定是排好的序列与原序列相等的位置&#xff0c;并且对应原数组的位置左右两边左边小右边大 #include<iostream> #include<algorithm> #include<vector>using namespace std;const in…

为什么选择Lua语言开发游戏?探索其高效与灵活之秘

在当今的游戏开发领域&#xff0c;有多种编程语言可以选择&#xff0c;每种语言都有其独特的优势和适用场景。而在这些语言中&#xff0c;Lua语言因其高效性和灵活性而备受游戏开发者的青睐。那么&#xff0c;为什么选择Lua语言开发游戏呢&#xff1f;本文将深入探索其背后的原…

Java转成m3u8,hls格式

Java转成m3u8,hls格式 需求分析 大致思路 循环文件夹下面所有文件判断当前文件是否是视频文件&#xff0c;如果是视频文件先转为ts文件 因为听别人说先转成ts之后再切片会快很多 转成ts文件&#xff0c;并为这些文件单独生成一个目录&#xff0c;如果目录不存在则新建一个目…

Linux 挂载读取、卸载 ntfs格式硬盘

windows常用的ntfs硬盘分区格式&#xff0c;在linux通常不能直接读取&#xff0c;不过挂载也是非常容易 一、挂载ntfs分区 1.安装 apt-get install ntfs-3g2.查看现在接上的硬盘 fdisk -l可以找到类似如下的&#xff0c;会显示microsoft basic data 3.创建挂载的目录 创…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

家用洗地机什么品牌比较好?洗地机口碑榜

近年来&#xff0c;家庭清洁产品备受瞩目&#xff0c;人们寻求省力的清洁解决方案&#xff0c;在清洁产品上面的购买真的是煞费苦心。各大厂商们也不负众望&#xff0c;推出了洗地机&#xff0c;这一产品在市场上受到了广泛欢迎。洗地机作为新时代的产物&#xff0c;集吸尘、拖…

基于OpenLayers实战地理信息系统教程

第1讲-概述.rar 第2讲-庞杂的GIS体系概览 01.rar 第3讲-项目快速实战(-).rar 第4讲-项目快速实战(二) 01.rar 第5讲-项目快速实战(三).rar 第6讲-项目快速实战(四).rar 第7讲-项目快速实战(五).rar 第8讲-项目快速实战(六).rar 第9讲-项目快速实战(七).rar 第10讲-项目…

go-zero 统一返回

1、整体目录结构 1、全局处理主入口 package manageimport ("net/http""github.com/zeromicro/go-zero/rest/httpx" )type Body struct {Code int json:"code"Message string json:"message"Result interface{} jso…

研究性学习:社会关注的热点问题研究

1. 课题名称 社会关注的热点问题研究 2. 起止时间 起始时间:2024年1月25日 结束时间:2024年2月20日 3. 项目组成员 组长:刘明组员:赵丽、陈鑫校内指导教师:王老师校外指导教师:社会工作者李教授4. 组员分工情况 搜集整理资料: 刘明:负责搜集西安市健康上网问题的资…

Git笔记:常用使用Git命令+使用Git关联本地仓库和远程仓库操作步骤

Git 分布式版本控制系统 常用Git命令 创建一个管理代码的文件目录右键Git Bath打开完成配置信息&#xff0c;输入个人用户名、邮件信息 git config --global user.name 用户名 git config --global user.email 邮箱地址初始化仓库 git init: 初始化仓库 文件目录里会出现一个…

2.数据结构 顺序表(自留笔记)

文章目录 一.静态顺序表&#xff1a;长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下&#xff1a;2.下面是写一段Print&#xff0c;打印数字看看&#xff1a;3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用&#xff1a;利用顺序表写一…

HarmonyOS鸿蒙学习笔记(23)监听Wifi状态变化

监听Wifi状态变化 前言创建接收状态变化的Bean对象创建订阅者和订阅事件参考资料&#xff1a; 前言 本篇博文通过动态订阅公共事件来说明怎么使用HarmonyOS监听Wifi状态的变化。关于动态订阅公共事件的概念&#xff0c;官网有详细说明&#xff0c;再次就不在赘述。博文相关项目…