首页 » SEO优化 » php中问题技巧_PHP弱类型安然问题总结

php中问题技巧_PHP弱类型安然问题总结

访客 2024-11-29 0

扫一扫用手机浏览

文章目录 [+]

在PHP中的特性便是弱类型,以及内置函数对付传入参数的疏松处理。
本篇文章紧张便是记录我在做攻防平台上面碰着的PHP的函数中存在的问题,以及PHP的弱类型所带来的问题。

前段韶光做了南京邮电大学网络攻防平台上面的题目,写了一个writeup之后,还有必要总结一下。
由于做的题目都是web类型的,所有的题目都是利用PHP来写的,以是很多题目并没有稽核到传统的如SQL注入,XSS的类型的漏洞,很多都是PHP本身语法的问题。
鉴于目前PHP是天下上最好的措辞,PHP本身的问题也可以算作是web安全的一个方面。
在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' //true

0 == 'abcdefg' //true

0 === 'abcdefg' //false

1 == '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会将此字符串解析成为十进制然后再进行比较,0×1240解析成为十进制便是123456,以是与int类型和string类型的123456比较都是相等。
攻防平台中的起名字真难便是稽核的这个特性。

类型转换

常见的转换紧张便是int转换为string,string转换为int。

int转string:

$var = 5;

办法1:$item = (string)$var;

办法2:$item = strval($var);

string转int:intval()函数。

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

var_dump(intval('2')) //2

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

var_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)); //true

var_dump(in_array('1bc', $array)); //true

可以看到上面的情形返回的都是true,由于’abc’会转换为0,’1bc’转换为1。

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

标签:

相关文章