PHP弱类型安全问题的详细概述

前言

我相信每个人都知道PHP是世界上最好的语言,PHP本身的问题可以看作是Web安全的一个方面。PHP中的特性是弱类型的,而内置函数对于传入参数是松散处理的。

这篇文章主要是记录我在php函数中遇到的问题,我在攻防平台上遇到的问题以及PHP的弱类型问题。对于大家在学习或使用PHP方面有一定的参考价值,下面看看。

PHP弱类型简介

小编辑器认为PHP非常强大,因为PHP提供了许多独特的特性开发人员使用,其中之一是PHP的弱类型机制。

在PHP中,可以完成的操作。


参数= 1美元;
$参数=阵();
$参数=stringg ;


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

类型转换的问题

类型转换是一个不可避免的问题,例如,当需要将GET或GET的参数转换为int类型时,或者当两个变量不匹配时,PHP将自动转换变量,但PHP是一种弱语言类型,在类型转换期间会导致许多意想不到的问题。

比较运算符

类型转换

在比较中


美元= null;$b =假; / /真的
$ =


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



使用比较运算符时也存在类型转换的问题,如下所示:


0 = = 0 / /真的
0 = 'abcdefg / /真的
0 = 'abcdefg / /假
1 = '1abcdef / /真的


当比较不同类型的变量时,会出现变量变换的问题,转换后可能出现问题。

哈希比较

除此之外,在比较哈希时也会出现问题:


0e132456789=0e7124511451155 / /真的
0e123456abc=0e1dddada / /假
0e1abc 0 / /真的


当你有了一个比较操作,如果你遇到了一系列0e D +字符串解析为科学计数法,所以2号在上面的例子中的值是0,因此是平等的。这种模式将不0e D +不满意这是相等的。话题已经过测试的MD5碰撞的攻击和防御平台。

十六电平转换

还有十六个二进制冗余字符串之间的比较运算问题。

例子如下:


0x1e240 123456 / /真的
0x1e240= = 123456 / /真的
0x1e240=1e240 / /假


当一个字符串是0x开头,PHP将字符串解析成十进制,然后比较,0x1240解析成十进制是123456,所以它是等于123456的int类型和字符串类型。这个名字的特点可以攻击平台研究。

类型转换

常见的转换是int到字符串的转换,以及字符串到int的转换。



整型字符串:


$ var = 5;
模式1:$ =(字符串)$ var;
模式2:$项= strval($变量);


字符串转int:intval()函数。



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


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


当intval()转换的解释,它将从字符串知道遇到一个非数字字符开始转换。即使是一个字符串,不能被转换,intval()不犯错误,但返回0。



这一特点intval()被发现在MySQL的标题在攻击和防御平台。



同时,程序员在编程时不应该使用下面的代码:


如果(intval(合一)> 1000){
mysql_query(SELECT * FROM消息id是。美元)
}


此时,$ A的值可能是1002…

内建函数参数的松动

内置函数的松散性是调用函数赋予函数不可接受的参数类型。解释是一点一点,或者直接通过实际例子来说明问题,下面将介绍这个函数的一些关键功能。

(MD5)


{ } =阵列(2美元

条=
);
$ array2 =阵列(foo
var_dump(MD5($ 2)= = var_dump($ array2)); / /真的


的MD5的描述()在PHP手册中的功能是字符串的MD5(String str {,} = false布尔raw_output美元),和MD5的需要()是字符串类型的参数。但当你经过一个阵列,MD5()不会报告错误。知识将不能正确地获得数组的MD5值,这将导致任何2个数组的MD5值相等。

StrCmp()

strcmp()的描述,在PHP官方手册函数(字符串str1字符串int StrCmp美元,美元出现),这需要通过字符串类型的参数(StrCmp 2)。如果str1小于str2,返回1,返回0相等,或返回1的strcmp函数。将一个字符串转换为ASCII码本质两变量,然后减去他们,然后确定返回值根据运行结果。



如果即将上任的StrCmp()的参数是多少


$array = {1,2,3};
var_dump(strcmp($array,'123 ')); / /空,在某种意义上相当于假空。


通过检查的strcmp特点的攻击和防御平台。

开关()

如果开关是对数字类型的判断,则开关将其参数转换为int类型:


我=2abc ;
开关($ i){
案例0:
案例1:
案例2:
我小于3,但不是否定的;
打破;
案例3:
回声我是3;
}


此时,程序输出是小于3但不是负数,这是由于开关()函数的I $类型转换,转换结果为2。

In_array ()

在PHP手册,对in_array解释()函数是布尔in_array(混合针阵列美元,美元美元草堆{ bool严格=假})。如果没有提供的布尔型参数,再利用宽松的比较来判断它是否是在中间,当strince价值是真实的,in_array()将比较是否针的类型和在草堆的类型是相同的。


$array = { 0、1、2、3};
var_dump(in_array(ABC,数组)); / /真的
var_dump(in_array('1bc,数组)); / /真的


可以看出,上述情况返回所有真实的,because'abc'will被转换为0,和'1bc转换为1。



array_search()是in_array相同()。



总结

以上是为您总结一些PHP弱类型的安全问题,希望本文能帮助您学习或工作,如果有疑问,可以留言。