04 数字转换比较
05 switch比较
06 数组比较
PHP的数据类型有很多,包含:字符串(String)、整型(Integer)、浮点型(Float)、布尔型(Boolean)、数组(Array)、对象(Object)、空(Null)和资源(Resource)。
但PHP是一种弱类型语言,这造就了PHP的简单易学,但也容易写出漏洞。
弱类型指的是变量无需类型声明,在代码执行过程中,可以动态变换。
01 弱数据类型的安全问题
不同类型的数据在进行比较的时候,会自动进行类型转换。
例如:
var_dump(false == 0); var_dump(false == ‘’); var_dump(false == ‘0’); var_dump(0 == ‘0’); var_dump(0 == ‘0xxx’); var_dump(0 == ‘xxx’);
你觉得上面有正确的判断吗?
答案:以上判断式均为真。
在使用弱类型机制的时候需要特别留意以下几种比较,包括:Hash比较、bool比较、数字转换比较、switch比较以及数组比较。
02 Hash比较
哈希(Hash)用于将任意长度的输入通过散列算法变换成固定长度的输出,其特点就是很难找到逆向规律,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。
如果Hash值以0e开头,而后面都是数字,则在与数字进行比较时,就会被解析成 0×10 ,此时就会被判断与0相等,这就可以绕过某些逻辑判断。
例如:
var_dump(‘0e123456789’ == 0); // bool(true) var_dump(‘0e123456789’ == ‘0’); // bool(true)
要想解决这一问题,我们需要使用 hash_equals() 函数来进行比较,hash_equals() 是可以防止时序攻击的一种字符串比较方法。
在密码学中,时序攻击是一种侧信道攻击,攻击者试图通过分析加密算法的时间执行来推导出密码。每一个逻辑运算在计算机需要时间来执行,根据输入不同,精确测量执行时间,根据执行时间反推出密码。
例如:
不过需要注意的是 hash_equals() 函数在 PHP5.6 中才得到支持,如果软件版本过低,则需要自行定义实现代码。
var_dump(hash_equals(‘0e123456789’ ,‘0’)); // bool(false)
03 bool比较
当遇到非空字符串与布尔值发生比较时,系统会自动将非空字符串转换为 true,将空字符串转换为 false。
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!