0

0

谈谈PHP弱类型安全问题

little bottle

little bottle

发布时间:2019-04-27 11:37:30

|

3328人浏览过

|

来源于51cto

转载

本篇文章小编想和大家谈谈php弱类型,php弱类型给程序员书写代码带来了很大的便利,但是任何事物都有两面性,现在随着小编一起了解一下吧。

0x00 弱类型初探

没有人质疑php的简单强大,它提供了很多特性供开发者使用,其中一个就是弱类型机制。

在弱类型机制下 你能够执行这样的操作

<?php
$var = 1;
$var = array();
$var = "string";
?>

php不会严格检验传入的变量类型,也可以将变量自由的转换类型。

立即学习PHP免费学习笔记(深入)”;

比如 在$a == $b的比较中

$a = null; $b = false; //为真
$a = ''; $b = 0; //同样为真

然而,php内核的开发者原本是想让程序员借由这种不需要声明的体系,更加高效的开发,所以在 几乎所有内置函数以及基本结构 中使用了很多松散的比较和转换,防止程序中的变量因为程序员的不规范而频繁的报错,然而这却带来了安全问题。

0x02 知识预备 php内核之zval结构

在PHP中声明的变量,在ZE中都是用结构体zval来保存的

zval的定义在zend/zend.h

typedef struct _zval_struct zval;  
struct _zval_struct {  
  /* Variable information */  
  zvalue_value value; /* value */  
  zend_uint refcount__gc;  
  zend_uchar type;/* active type */  
  zend_uchar is_ref__gc;  
};  
typedef union _zvalue_value {  
  long lval;  /* long value */  
  double dval;/* double value */  
  struct {  
    char *val;  
    int len;  
  } str;  
  HashTable *ht;  /* hash table value */  
  zend_object_value obj;  
} zvalue_value;

其中php通过type判断变量类型 存入value

如上也就是php内核中弱类型的封装,也是我们后面讲的所有东西的原理和基础。

0x03变量的强制转换

通过刚刚的了解,我们知道zval.type决定了存储到zval.value的类型。

当源代码进行一些未限制类型的比较,或数学运算的时候,可能会导致zval.type的改变,同时影响zval.value的内容改变。

当int遇上string

cp.1 数学运算

当php进行一些数学计算的时候

ar_dump(0 == '0'); // true
var_dump(0 == 'abcdefg'); // true  
var_dump(0 === 'abcdefg'); // false
var_dump(1 == '1abcdef'); // true

当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。

相当于对字符串部分

intval再和整数部分比较,其实也就是改变了zval.type的内容 尤为注意的是,'1assd'的转换后的值是1,而‘asdaf’是0

也说明了intval会从第一位不是数字的单位开始进行

所有也有

var_dump(intval('3389a'));//输出3389

这个例子就告诉我们,永远不要相信下面的代码

if($a>1000){    
mysql_query('update ... .... set value=$a')
}

你以为这时候进入该支的万无一失为整数了

其实$a可能是1001/**/union...

cp.2 语句条件的松散判断

举个例子php的switch使用了松散比较. $which会被自动intval变成0如果每个case里面没有break ,就会一直执行到包含,最终执行到我们需要的函数,这里是成功包含

<?php
if (isset($_GET['which']))
{
  $which = $_GET['which'];
  switch ($which)
  {
  case 0:
  case 1:
  case 2:
    require_once $which.'.php';
    break;
  default:
    echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false);
    break;
  }

cp.3 函数的松散判断

var_dump(in_array("abc", $array));

in_array — 检查数组中是否存在某个值 参数

needle 待搜索的值。

Note: 如果 needle 是字符串,则比较是区分大小写的。 haystack 这个数组。

strict 如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。

叮当好记-AI音视频转图文
叮当好记-AI音视频转图文

AI音视频转录与总结,内容学习效率 x10!

下载

可以看到,只有加了strict才会对类型进行严格比较, 那么我们再次把×××和字符串进行比较呢?

var_dump(in_array("abc", $array1));</br>
var_dump(in_array("1bc", $array2));

它遍历了array的每个值,并且作"=="比较(“当设置了strict 用===”)

结果很明显了

如果array1里面有个值为0,那么第一条返回就会为真//intval('abc')=0

如果array2里面有个值为1,那么第二条就会为真//intval('1bc')=1

array_search也是一样的原理

这里的应用就很广泛了,

很多程序员都会检查数组的值,

那么我们完全可以用构造好的int 0或1 骗过检测函数,使它返回为真

总结一下, 在所有php认为是int的地方输入string,都会被强制转换 ,比如

$a = 'asdfgh';//字符串类型的a</br>
echo $a[2];  //根据php的offset 会输出'd'</br>
echo $a[x];  //根据php的预测,这里应该是int型,那么输入string,就会被intval成为0 也就是输出'a'

当数组遇上string

这一个例子我是在德国的一个ctf中遇到,很有意思前面我们讲的都是string和int的比较

那么array碰上int或者是string会有什么化学反应?

由php手册我们知道

Array转换整型int/浮点型float会返回元素个数;

转换bool返回Array中是否有元素;转换成string返回'Array',并抛出warning。

那么实际应用是怎样的呢?

if(!strcmp($c[1],$d) && $c[1]!==$d){
...
}

可以发现,这个分支通过strcmp函数比较要求两者相等且“==”要求两者不相等才能进入。

strcmp() 函数比较两个字符串。

该函数返回:

0 - 如果两个字符串相等

<0 - 如果 string1 小于 string2

>0 - 如果 string1 大于 string2

这里的strcmp函数实际上是将两个变量转换成ascii 然后做数学减法,返回一个int的差值。

也就是说键入'a'和'a'进行比较得到的结果就是0

那么如果让$array和‘a’比较呢?

http://localhost:8888/1.php?a[]=1
var_dump(strcmp($_GET[a],'a'));

这时候php返回了null!

也就是说,我们让这个函数出错从而使它恒真,绕过函数的检查。

0x04时时防备弱类型

作为一个程序员,弱类型确实给程序员书写代码带来了很大的便利,但是也让程序员忘记了$array =array();的习惯。都说一切输入都是有害的

那么其实可以说一切输入的类型也是可疑的,永远不要相信弱类型的php下任何比较函数,任何数学运算。否则,你绝对是被php出卖的那一个。

相关教程:PHP视频教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

作者最新文章

jq是指什么?

2019-05-31 16:04

vue是做什么的

2019-05-31 16:58

mysql能干什么

2019-05-31 17:15

怎么用cmd进入mysql

2019-05-31 17:24

mysql怎么输入

2019-05-31 17:41

mysql免费版好用么

2019-05-31 17:53

mysql慢查询是什么

2019-05-31 18:00

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

chatgpt官网入口地址合集
chatgpt官网入口地址合集

本专题整合了chatgpt官网入口地址、使用教程等内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

4

2026.03.16

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

7

2026.03.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

114

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

141

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

396

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

65

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

111

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号