关于php必须谨慎处理变量和调用内置函数的几点总结,否则会带来安全方面的灾难
2016-08-30 09:30
543 查看
由于PHP是弱类型脚本语言,对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。因此,从现在开始,你必须认真、严谨、缜密的处理你的变量,否则,一旦项目上线运行,出现的bug将是致命的,甚至你都无法溯源!
第一个:变量比较
基于PHP在比较的两个变量不匹配的时候,会自动地进行变量转换。由于其自身宽松的变量类型的原因,导致在进行类型转换的时候会存在很多意想不到的结果。
例如:$var1 == $var2 的判断
解决该问题的办法是使用比较运算符‘===’(全等) 判断。即既比较数值,又比较类型!
与以上类似的情况还有这些:
第一个:变量比较
基于PHP在比较的两个变量不匹配的时候,会自动地进行变量转换。由于其自身宽松的变量类型的原因,导致在进行类型转换的时候会存在很多意想不到的结果。
例如:$var1 == $var2 的判断
$var1 = null; $var2 = false; //其比较结果布尔值为true $var1 = ''; $var2 = null; //其比较结果值true
解决该问题的办法是使用比较运算符‘===’(全等) 判断。即既比较数值,又比较类型!
与以上类似的情况还有这些:
0=='0' //true 0 == 'abcdefg' //true 0 === 'abcdefg' //false 1 == '1abcdef' //true
第二个:强制类型转换方面
转换主要就是int转换为string,string转换为int。
string 转 int 的函数为 intval()
int 转string的方法有两种:1.强制类型转换 (string)$var_tmp; 2.使用函数 strval();
说明intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。
第三个:内置函数参数的松散性
内置函数的松散性说的是,调用函数时给函数传递函数无法接受的参数类型,部分只是产生警告,并不会产生致命错误,程序仍然执行的情况!
a. md5()加密函数
$array1[] = array( "foo" => "bar", "bar" => "foo", ); $array2 = array("foo", "bar", "hello", "world"); var_dump(md5($array1)==var_dump($array2)); //true
b. strcmp() 字串比较函数
$array=[1,2,3]; var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。
c. 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"; }
d. in_array()这个比较常用,一定注意
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true因此,我们要严格判断时,应加上第三个参数,正确使用如下:
$array=[0,1,2,'3']; var_dump(in_array('abc', $array,true)); //false var_dump(in_array('1bc', $array,true)); //false
拿出以上案例,借此抛砖引玉,可见没有正确处理变量和调用内置函数的可怕了吧?从现在开始,养成一个良好的习惯,对于内置函数,做到了解函数原型及各参数的意义;对于变量,进行判断时,一定要考虑类型自动转换的因素,来确定是否使用 == 或者是 === , != 或者是 !== 。
相关文章推荐
- 关于php面向对象继承方面的几点总结
- 关于C语言变量和函数命名总结以下几点,大家可以讨论交流一下:
- 如果你是来12306系架,你如何实现? ——关于构建安全、稳定、高吞吐量的火车票网络售票系统几个方面(2)结束及总结
- 关于2410上LCD移植方面的几点总结(含触摸屏)——转载
- 带有public static void main方法的类,其中的成员变量必须是static的,否则main方法没法调用。除非是main里的局部变量。因为main方法就是static的啊。
- PHP的关于变量和日期处理的一些面试题目整理
- C语言基础知识(个人简单总结的关于变量和函数方面)
- PHP安全处理之Mcrypt使用总结
- 关于excelphp的调用 导入导出(个人学习总结)
- 关于2410上LCD移植方面的几点总结(含触摸屏)
- PHP中实现表单变量的安全处理,防止SQL注入
- PHP的关于变量和日期处理的一些面试题目整理
- PHP关于文件下载方面知识的总结(包括图片,文件等)
- PHP中实现表单变量的安全处理,防止SQL注入
- 今天做应用 用到了不少关于时间处理方面的东西,总结一下,希望大家指正!
- 关于“.aspx调用CodeFile(.cs文件)中变量 ”总结
- php变量处理函数总结
- 关于super和this关键字调用构造器的几点总结
- 关于2410上LCD移植方面的几点总结(含触摸屏)——转载
- 关于项目中异常处理的一些总结