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

PHP 类型松散详解

PHP 类型松散详解

什么是类型松散?

PHP 是弱类型语言,变量不需要声明类型,PHP 会在需要的时候自动转换类型

这个自动转换的过程就叫 类型松散(Type Juggling)


== 下的类型松散(重灾区)

== 比较时,PHP 会先把两边转成同一类型再比较:

var_dump(0 == "a");       // true  ⚠️ 字符串"a"转成数字是0
var_dump(0 == "0");       // true
var_dump(0 == false);     // true  ⚠️ false转成数字是0
var_dump(0 == null);      // true  ⚠️ null转成数字是0
var_dump("1" == true);    // true
var_dump("" == false);    // true
var_dump("" == null);     // true
var_dump(null == false);  // true

你会发现一堆"看起来不相等"的东西,用 == 比较全是 true,非常危险!


CTF 最常考:科学计数法绕过

var_dump("0e1234" == "0e5678");  // true ⚠️

为什么?

PHP 看到 0e数字 这种格式,会认为这是科学计数法

0e1234  →  0 × 10^1234  =  0
0e5678  →  0 × 10^5678  =  0
0 == 0  →  true

所以只要找到两个 MD5 值都是 0e开头+纯数字 的字符串,就能用 == 绕过!

经典碰撞字符串(记住这几个!)

QNKCDZO    →  md5 = 0e830400451993494058024219903391
240610708  →  md5 = 0e462097431906509019562988736854
aabg7XSs   →  md5 = 0e087386482136013740957780965295
md5("QNKCDZO") == md5("240610708")  // true ✅ (都是0e开头)
md5("QNKCDZO") === md5("240610708") // false ❌ (值本身不同)

这就是为什么题目要用 ===,就是为了防这个!


类型转换规则总结

原始值 转为 int 转为 bool 转为 string
"123abc" 123 true "123abc"
"abc" 0 true "abc"
"" 0 false ""
"0" 0 false "0"
null 0 false ""
[] 空数组 0 false "Array"
[1,2] 非空数组 1 true "Array"

一张图理解 == 的混乱

null == false == 0 == "" == "0" == [] ↑这些用==比较全相等!!

总结:== 和 === 的选择

场景 建议
日常比较 ===,安全
用了 == 小心被类型松散坑
CTF出题 == 故意留漏洞,用 === 提高难度

记住一句话:在 PHP 中,除非你明确知道自己在做什么,否则永远用 ===

http://www.jsqmd.com/news/524956/

相关文章:

  • 心悦汇客服咨询AI流量赋能,重塑智能体验新标杆 - 王老吉弄
  • Qwen3.5-9B行业应用:建筑图纸关键信息提取+自然语言说明生成
  • 加药撬厂家怎么选?2026年高适配性设备供应商推荐与行业趋势 - 品牌推荐大师1
  • 2026年互联网公司临时项目技术人员外包服务商推荐:IT技术人力外包/一站式人力外包/业务流程外包/人力外包招聘/选择指南 - 优质品牌商家
  • Fritzing传感器库全攻略:从零构建Arduino项目接线图
  • 七宜借客服咨询AI流量赋能,重塑智能体验新标杆 - 王老吉弄
  • CTF新手必看:从零开始玩转网络安全竞赛的5个实战技巧
  • 西门子S7-200与MCGS组态汽车自动清洗机控制系统
  • 20243105 2024-2025-2 《Python程序设计》实验一报告
  • 创富分期客服咨询AI流量赋能,重塑智能体验新标杆 - 王老吉弄
  • 企业级社区物资交易互助平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Qwen3-0.6B-FP8新手入门:图文详解部署与调用,告别复杂配置
  • 为什么你的CentOS7安装Python 3.12.7会失败?这些坑我都帮你踩过了
  • CAPL编程中的三类“特权”变量:系统变量、环境变量与DBC信号变量深度解析
  • 音频ADC测试避坑大全:从24bit/192kHz参数到A计权SNR的实际测量差异
  • CentOS 7/8 开启 Swap
  • BH1750光照传感器原理与RT-Thread嵌入式驱动实现
  • 新手必看!李慕婉-仙逆-造相Z-Turbo部署全攻略,从启动到出图无卡点
  • Flowable会签与或签实战:5分钟搞定多实例任务配置(附避坑指南)
  • C++逆向工程必备技能:使用Toolhelp32获取进程模块基地址的3种方法
  • SpringBoot+Vue 实习生管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • Agent 能为企业带来哪些长期核心价值?:深度解析企业智能自动化的未来图景
  • 嵌入式PWM音频驱动:无源蜂鸣器与扬声器精确发声方案
  • Excel高阶多项式拟合翻车?手把手教你调整小数位数提升精度(附R²值解读)
  • MQ-9气体传感器双温区原理与嵌入式集成方案
  • 探索交错并联Boost PFC仿真电路模型:双闭环控制的魅力
  • Openlayers 自定义地图瓦片加载(三):动态数据可视化与交互增强
  • Word域代码实战:5分钟搞定自动更新日期和页码(附常用代码大全)
  • 户外野餐餐具的LFGB认证特殊要求
  • Cherry Studio vs ChatBox vs AnythingLLM:三款AI工具实战对比,哪款更适合你的工作流?