千家信息网

有哪些PHP弱类型的安全问题

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要介绍"有哪些PHP弱类型的安全问题",在日常操作中,相信很多人在有哪些PHP弱类型的安全问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"有哪些PHP弱类型
千家信息网最后更新 2025年02月08日有哪些PHP弱类型的安全问题

这篇文章主要介绍"有哪些PHP弱类型的安全问题",在日常操作中,相信很多人在有哪些PHP弱类型的安全问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"有哪些PHP弱类型的安全问题"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

PHP弱类型简介

小编之所以认为php很强大是因为php提供了很多独有的特性工开发者使用,其中一个就是php弱类型机制。

在PHP中,可以进行一下的操作。

$param = 1;$param = array();$param = "stringg";

弱类型的语言对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。

类型转换问题

类型转换是无法避免的问题。例如需要将GET或者是POST的参数转换为int类型,或者是两个变量不匹配的时候,PHP会自动地进行变量转换。但是PHP是一个弱类型的语言,导致在进行类型转换的时候会存在很多意想不到的问题。

比较操作符

类型转换

$a==$b的比较中

$a=null;$b=flase ; //true$a='';$b=null; //true

这样的例子还有很多,这种比较都是相等。

使用比较操作符的时候也存在类型转换的问题,如下:

0=='0' //true0 == 'abcdefg' //true0 === 'abcdefg' //false1 == '1abcdef' //true

当不同类型的变量进行比较的时候就会存在变量转换的问题,在转换之后就有可能会存在问题。

Hash比较

除了以上的这种方式之外在进行hash比较的时候也会存在问题。如下:

"0e132456789"=="0e7124511451155" //true"0e123456abc"=="0e1dddada" //false"0e1abc"=="0"  //true

在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。这个题目在攻防平台中的md5 collision就有考到。

十六进制转换

还存在一种十六进制余字符串进行比较运算时的问题。

例子如下:

"0x1e240"=="123456" //true"0x1e240"==123456 //true"0x1e240"=="1e240" //false

当其中的一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较,0x1240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。攻防平台中的起名字真难就是考察的这个特性。

类型转换

常见的转换主要就是int转换为string,string转换为int。

int转string:

$var = 5;方式1:$item = (string)$var;方式2:$item = strval($var);

string转intintval()函数。

对于这个函数,可以先看2个例子。

var_dump(intval('2')) //2var_dump(intval('3abcd')) //3var_dump(intval('abcd')) //0

说明intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。

intval()的这种特性在攻防平台中的MYSQL这道题目中就有考到。

同时,程序员在编程的时候也不应该使用如下的这段代码:

if(intval($a)>1000) { mysql_query("select * from news where id=".$a)}

这个时候$a的值有可能是1002 union…..

内置函数的参数的松散性

内置函数的松散性说的是,调用函数时给函数传递函数无法接受的参数类型。解释起来有点拗口,还是直接通过实际的例子来说明问题,下面会重点介绍几个这种函数。

md5()

$array1[] = array( "foo" => "bar", "bar" => "foo",);$array2 = array("foo", "bar", "hello", "world");var_dump(md5($array1)==var_dump($array2)); //true

PHP手册中的md5()函数的描述是string md5 ( string $str [, bool $raw_output = false ] )md5()中的需要是一个string类型的参数。但是当你传递一个array时,md5()不会报错,知识会无法正确地求出array的md5值,这样就会导致任意2个array的md5值都会相等。这个md5()的特性在攻防平台中的bypass again同样有考到。

strcmp()

strcmp()函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ) ,需要给strcmp()传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。

如果传入给出strcmp()的参数是数字呢?

$array=[1,2,3];var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。

strcmp这种特性在攻防平台中的pass check有考到。

switch()

如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。如下:

$i ="2abc";switch ($i) {case 0:case 1:case 2: echo "i is less than 3 but not negative"; break;case 3: echo "i is 3";}

这个时候程序输出的是i is less than 3 but not negative,是由于switch()函数将$i进行了类型转换,转换结果为2。

in_array()

在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) ,如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。

$array=[0,1,2,'3'];var_dump(in_array('abc', $array)); //truevar_dump(in_array('1bc', $array)); //true

可以看到上面的情况返回的都是true,因为'abc'会转换为0,'1bc'转换为1。

array_search()in_array()也是一样的问题。

到此,关于"有哪些PHP弱类型的安全问题"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

类型 问题 函数 时候 变量 字符 参数 字符串 例子 平台 特性 安全 就是 学习 运算 松散 手册 数字 方式 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 商品数据库数据集 开票软件提示未连接数据库 成都阿里云服务器 新能源网络安全渗透是什么意思 云熙服务器跟用户名 奥巴马政府的网络安全战略 风暴2021共护核网络安全 计算机软件开发合同纠纷问题汇总 微信开发者工具数据库在哪写 昌乐软件开发初级教程哪家好 扬州app软件开发专家 连接数据库的操作命令 教育局网络安全管理文件 ccnp 网络安全 bim软件开发工程要多少钱 sql 数据库 触发器 天津市教育系统网络安全平台 建立网络安全制度成效 qq邮箱服务器设置 光遇ios显示服务器繁忙怎么办 数据库的基本结构和特点 前锦网络技术信息有限公司 注册信息怎么传到服务器数据库 宁德数据库审计哪家专业 军队装备数据库建设 智慧工业服务器 潍坊科技学院互联网大赛 平阴软件开发有限公司 淮安网络安全准入控制系统公司 天津市教育系统网络安全平台
0