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弱类型的安全问题,希望本文能帮助您学习或工作,如果有疑问,可以留言。