PHP弱类型

![](C:\Users\21649\Pictures\Screenshots\屏幕截图 2024-12-04 203915.png)

PHP 是一种弱类型(也称为动态类型)的脚本语言。PHP 比较 2 个值是否相等可以用 “ == ” 或 “ === ”,“ == ” 会在比较时自动转换类型而不改变原来的值,因此这个符号经常出现漏洞。如果遇到了 “===” 则不会进行类型转换

null,0,“0”,array(),字母,进制的比较

![](C:\Users\21649\Pictures\Screenshots\屏幕截图 2024-12-04 210205.png)

  1. 字母和数字进行弱类型比较时,字母会转换成”null”
  2. 进制类的字符串在进行弱类型比较时会自动的转换成所对应的数字。

南邮web 起名字矛盾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});//ord是查询ascll码的函数。
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag;
else
echo 'access denied';
?>

54975581388转换成十六进制是0xccccccccc

超过精确度的弱类型问题

超过精确度的数字(小数点后超过17位)在进行弱类型比较时,会出 现相等的情况。例如var_dump(0.99999999999999999==1)的结果为 True。

in_array()函数

in_array()函数的基本格式为:in_array($search,Array()),表示搜索 $search是否为数组Array()的元素。in_array()函数实际上存在第三个参 数,该参数默认为false。如果第三个参数设置为true,则判断$search与 数组的值类型是否相同,即进行强类型比较;若第三个参数设置为 false,则in_array()函数进行判断的时候,会强制将$search的值转换为 数组的值类型,此时就是弱类型比较。

1
2
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )