首页 > 代码库 > PHP弱类型安全问题笔记

PHP弱类型安全问题笔记

一、类型转换问题

 intval();     var_dump(intval(‘1asdfasd‘));  //1    var_dump(intval(‘awqw12‘));  //0    var_dump(intval(array()));    //0    var_dump(intval(array(‘foo‘,‘val‘))); //1    var_dump(intval(0x1A)); //26  十六进制转换    var_dump(intval(‘asdfqwer‘)); //0   

 

    intval 如果转换值为字符串时,不会返回错误,而是返回 0,如果转换值为数组时,有两种情况,转换值为空数组时,则会返回0,否则就会返回 1

    注意:php用32位内存来保存一个整数,32位可以表示4294967296个数字,有符号的话就是-2147483647到2147483648;

 

二、内置函数松散性问题

   

 switch();      $i=‘3adcd‘;     switch($i){              case 1:                     echo ‘i is 1‘;                     break;              case 2:                     echo ‘i is 2‘;                     break;              case 3:                     echo ‘i is 3‘;                     break;              default:                    echo ‘i is default‘;                    break;     }

 

 

       以上结果,会进入switch case 3 里面,为什么会这样,如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类,所以上述执行的时候,首先会把$i进行了类型转换,转换结果为3 ,所以。。。

 

 

 

  in_array();    $arr = [0,1,2,3,‘test‘];    var_dump(in_array(‘abd‘,$arr));    // true    var_dump(in_array(‘1bc‘,$arr));    // true

 

    为什么上面执行结果会是这样的,后面通过查询手册,官方给出的说法是, in_array 默认是走松散比较方式,只比值是否相等,而不比较值的类型是否一样,所以才有上面这种结果,不过可以设置in_array 函数第三个参数,设置为True就是严谨的比较方式。

 

以上都是我们平常开发需要注意的地方。

PHP弱类型安全问题笔记