PHP比较漏洞, 代码审计, 字符串数字, “0e“字符串, 布尔值比较, 极限值, switch比较, in_array比较

PHP比较漏洞

一, 字符串与数字比较,'0e’字符串比较

在 PHP 中处理字符串和数字比较时需要小心谨慎的重要性,尤其是在安全敏感的应用中。
在某些情况下,PHP 的类型强制转换可能会导致意外和潜在的安全漏洞。

var_dump("admin" == 0);  //true
var_dump("1admin" == 1); //true
var_dump("admin1" == 1); //false
var_dump("admin1" == 0); //true
var_dump("0e123456" == "0e4456789"); //true 

这段代码展示了 PHP 中的一些有趣且可能导致安全隐患的类型强制转换行为。让我们逐一分析每个表达式:

var_dump("admin" == 0);
在 PHP 中,当一个字符串与数字进行比较时,如果字符串不是以数字开始,则该字符串会被转换为数字 0。因此,“admin” 被转换为 0,所以 0 == 0 是 true。

var_dump("1admin" == 1);
在这个例子中,字符串 “1admin” 在尝试转换为数字时,会被解析为数字 1,因为它以 1 开始,忽略后续非数字字符。因此,1 == 1 是 true。

var_dump("admin1" == 1);
这里 “admin1” 作为字符串,不能转换为数字 1,因为它不是以数字开始的。它将被转换为 0。所以,0 == 1 是 false。

var_dump("admin1" == 0);
同上,“admin1” 转换为数字时变成了 0,所以 0 == 0 是 true。

var_dump("0e123456" == "0e4456789");
这是 PHP 类型强制转换中最有趣的一个例子。当一个字符串看起来像是科学记数法时(例如 “0e123456”),在与另一个类似结构的字符串比较时,它们都会被转换为数字 0。

这是因为 e 后面的数字被解释为指数,但由于前面的数字是 0,所以整个表达式的值为 0。
因此,两个看似不同的字符串在这种情况下会被认为是相等的。

二, Hash字符串比较

原理还是科学计数法字符串比较的问题.

测试1:
var_dump("0e123456789012345678901234567890" === "0"); //false
var_dump("0e123456789012345678901234567890" == "0"); //true

因为 e 后面的数字被解释为指数,但由于前面的数字是 0,所以整个表达式的值为 0。

测试2:
$pass = $_GET['password'];
$password = '0e342768416822451524974117254469';if (md5($pass) == $password) {echo "flag{xx-xx-xxxx-xxx}";
}
else {echo "error";
}

对于上面的代码那么只要是提交的密码的md5值是以0e开头的都会绕过, 比如.

?pwd=s1885207154a

除了使用===进行判断外,从 PHP 5.6 开始,hash_equals() 函数被引入,主要用于安全地比较两个字符串的哈希值,通常用于密码或敏感数据的验证。

hash_equals() 函数的关键特点:
1. 时间恒定的比较

这意味着函数在比较两个字符串时所花费的时间不依赖于字符串的内容。这是预防某些类型的定时攻击的重要特性,例如,在一些安全关键的应用场景中,攻击者可能尝试通过测量不同输入导致的响应时间差异来推断信息

2. 二进制安全

hash_equals() 安全地处理二进制数据,确保在比较过程中不会因为特殊字符(如 NULL 字节)而意外截断或错误处理。

3. 字符串比较

它专门用于比较字符串,而不是用于其他数据类型。

一个典型例子是在用户认证系统中比较用户输入的密码哈希值与存储在数据库中的哈希值:

$expected = '存储的哈希值';
$provided = hash('sha256', '用户输入的密码');if (hash_equals($expected, $provided)) {// 密码匹配
} else {// 密码不匹配
}

三, bool比较

1. 在json字符串中:
$str = '{"user":true, "pass":true}';
$data = json_decode($str, true);if($data['user'] == 'root' && $data['pass'] == 'myPass'){echo '登陆成功 获得flag{xx-ssss-xxxx}';
}else{echo '登陆失败!';
}

这里用户名和pass都是true, 由于使用的是==判断, 两个比较的结果都是true.

2. 在序列化字符串中:
$str = 'a:2:{s:4:"user";b:1;s:4:"pass";b:1;}';
$data = unserialize($str); if($data['user'] == 'root' && $data['pass'] == 'myPass'){print_r('获得flag{xx-ssss-xxxx}');
}else{print_r('失败!');
}

a:2: 表示一个数组,包含 2 个元素。
s:4:"user";b:1; 表示数组的第一个键值对。键是一个长度为 4 的字符串 “user”,值是布尔值 true(在 PHP 序列化格式中表示为 b:1)。
s:4:"pass";b:1; 表示数组的第二个键值对。键是一个长度为 4 的字符串 “pass”,值也是布尔值 true。
那么用户名和pass都是true, 绕过了判断.

四, 极限值比较

$a=98869694308861098395599991222222222222;
$b=98869694308861098395599992999999999999;
var_dump($a === $b);

虽然两个值不同, 但是比较的结果是true.

五, switch比较

PHP 中的 switch 语句是松散比较(==),而不是严格比较(===)。这意味着类型强制转换会发生。

$num = '3number';
switch($num){case 0:echo '000';break;case 1:echo '111';break;case 2:echo '222';break;case 3:echo '333';break;default:echo "error";
}

$num = '3number'; 时,由于进行松散比较,PHP 会尝试将这个字符串转换为数字。
由于字符串以数字 3 开始,其余部分在转换过程中将被忽略,因此 $num 被视为数字 3。
结果并不会输出error, 而是333.

六, in_array函数比较

在 PHP 中,in_arrayarray_search 函数在默认情况下使用松散比较(==)
如果没有明确设置 strict 参数为 true,这些函数会执行类型强制转换,可能导致一些非直观的结果。

$array = ['a', 0, 1, 2, '3'];
var_dump(in_array('abc', $array)); // bool(true) 
var_dump(array_search('abc', $array)); // int(1) 

in_array('abc', $array) 在比较 'abc' 和数组中的0时,由于'abc'在松散比较中会被视为 0(非数字开头的字符串在转换为数字时会成为 0),因此 in_array 会返回 true
同理,array_search('abc', $array) 在寻找'abc'时也会找到0这个元素的位置,因此返回 1

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

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

相关文章

RecyclerView嵌套布局,导致RecyclerView复用失效 解决

前言:使用NestedScrollView嵌套RecyclerView。 解决步骤一:固定高度 NestedScrollView嵌套RecyclerView时,RecyclerView的高度是无限大,所以要将RecyclerView设置固定高度。在代码中固定的,灵活度更高。 binding.nest…

键盘方向键移动当前选中的table单元格,并可以输入内容

有类似于这样的表格&#xff0c;用的<table>标签。原本要在单元格的文本框里面输入内容&#xff0c;需要用鼠标一个一个去点以获取焦点&#xff0c;现在需要不用鼠标选中&#xff0c;直接用键盘的上下左右来移动当前正在输入的单元格文本框。 const currentCell React.u…

【数据结构初阶】单链表SLlist

描述 不同于顺序表&#xff0c;顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来&#xff0c;而是创建一个能存数据节点和节点与下一个节点之间的连接&#xff1b; 所以&#xff1a;“一个能存数据节点…

词向量笔记

一、词向量的世界排名比赛MTEB MTEB: Massive Text Embedding Benchmark 二、词向量的维数 词向量的维数d1一般取20~500之间

百分点科技|怎样做数据运营,才能让数据中台真正用起来?

导读&#xff1a;大多数企业用户已完成数据平台初步建设工作&#xff0c;但数据在业务运营和管理中没有发挥应有价值。数据开发工作繁重&#xff0c;数据质量问题严重&#xff0c;IT、数据和业务协作不畅&#xff0c;诸多问题依然困扰着企业用户的IT部门和数据部门。数据运营成…

起立科技(起鸿)在第25届高交会上展示透明OLED技术创新

第二十五届中国国际高新技术成果交易会 日期&#xff1a;2023年11月15日 地点&#xff1a;福田会展中心7号馆 深圳&#xff0c;2023年11月15日 — 起鸿科技&#xff0c;作为透明OLED领域的引领者&#xff0c;于今日参展了第二十五届中国国际高新技术成果交易会。这一展会将汇…

『亚马逊云科技产品测评』活动征文|通过lightsail一键搭建Drupal VS 手动部署

『亚马逊云科技产品测评』活动征文&#xff5c;通过lightsail一键搭建Drupal 提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚…

微服务架构中的 熔断和降级

文章目录 熔断判定服务的健康状态服务恢复正常 降级跨服务降级自身服务提供有损服务具体案例分析 熔断 微服务架构中&#xff0c;如果需要保障可用性&#xff0c;其中一个方式就是 熔断。熔断在微服务架构里面是指 当微服务本身出现问题的时候&#xff0c;它会拒绝新的请求&am…

《算法通关村——反转字符串中的单词问题解析》

《算法通关村——反转字符串中的单词问题解析》 151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接…

大学生如何免费认证,下载,安装MATLAB

下载 打开学校图书馆官网 选择版本后&#xff0c;点击下载 注册绑定个人认证 前提&#xff01;需要有学校邮箱【以edu.cn结尾的】 进入mathworks官网 注册账户 安装 下载完后&#xff0c;打开 选择&#xff1a;setup 安装程序 勾选&#xff1a;是&#xff1b;选择&#xf…

记GitLab服务器迁移后SSH访问无法生效的问题解决过程

公司IT心血来潮对GitLab服务器进行安全升级&#xff0c;升级后无法启动。。。只得启用备用服务器&#xff0c;具体的备份机制不祥&#xff0c;只知道原数据都在&#xff0c;但文件系统是否完全一样不清楚。切换为备用服务器后使用SSH下载代码死活不成功&#xff0c;反复提示需要…

机器学习第10天:集成学习

文章目录 机器学习专栏 介绍 投票分类器 介绍 代码 核心代码 示例代码 软投票与硬投票 bagging与pasting 介绍 核心代码 随机森林 介绍 代码 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 介绍 集成学习的思想是很直观的&#xff1a;多个人判断的结合往往比…

身份证阅读器和社保卡读卡器Harmony鸿蒙系统ArkTS语言SDK开发包

项目需求&#xff0c;用ArkTS新一代开发语言实现了在Harmony鸿蒙系统上面兼容身份证阅读器和社保卡读卡器&#xff0c;调用了DonseeDeviceLib.har这个读卡库。 需要注意的是&#xff0c;鸿蒙系统的app扩展名为.hap&#xff0c;本项目编译输出的应用为&#xff1a;entry-default…

下厨房网站月度最佳栏目菜谱数据获取及分析PLus

目录 概要 源数据获取 写Python代码爬取数据 Scala介绍与数据处理 1.Sacla介绍 2.Scala数据处理流程 数据可视化 最终大屏效果 小结 概要 本文的主题是获取下厨房网站月度最佳栏目近十年数据&#xff0c;最终进行数据清洗、处理后生成所需的数据库表&#xff0c;最终进…

elmenetui表格二次封装包含查询框和分页

<!--dataList: 表格数据columnList: 表头字段 宽度minWidth使用slotName字段: 需要对列数据进行处理&#xff0c;不写prop字段&#xff0c;使用slotName字段btnText<String>: 按钮字段btnIcon<String>: 按钮的iconbtnEvent: 按钮事件btnType: 按钮类型getHeigh…

Go语言基础之基本语法

基本结构 package mainimport "fmt"func main() {fmt.Println("Hello,World!") }package mainimport ("fmt""log""net/http" )func handler(w http.ResponseWriter,r *http.Request) {s : "你好&#xff0c;世界&…

Dockerfile基础

前言 知识点整理 Dockerfile 简介 它是一个没有后缀名的文本文档&#xff0c;里面是组合镜像的一些命令&#xff0c;Docker build命令构建镜像时&#xff0c;通过读取Dockerfile中的指令的顺序&#xff08;自上到下&#xff09;自动生成镜像。 Dockerfile 命令 1. FROM 指…

JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6

前言 我个人项目中&#xff0c;不想使用太重的数据库&#xff0c;而内嵌数据库中SQLite又是最受欢迎的&#xff0c; 因此决定采用这个数据库。 可是JPA并不支持Sqlite&#xff0c;这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异&#xff0c; 但是…

Android消息机制(Handler、Looper、MessageQueue)

一、ThreadLocal 1、什么是ThreadLocal ThreadLocal 是一个线程内部的数据存储类&#xff0c;通过它可以在指定的线程中存储数据&#xff0c;数据存储以后&#xff0c;只有在指定线程中可以获取到存储的数据&#xff0c;对于其他线程来说则无法获取到数据。 一般来说&#xf…

竞赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…