弱数据类型的安全问题

64 阅读3分钟

01 弱数据类型的安全问题

02 Hash比较

03 bool比较

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。

var_dump(true == ''); // bool(false)
var_dump(true == 'root'); // bool(true)

如果你在使用变量时,不注意这些数据类型,就会带来各种安全隐患,而且还很难发现。

建议使用三个等号(===)来判断变量值与类型是否完全相等。

var_dump(true === ''); // bool(false)
var_dump(true === 'root'); // bool(false)

... ...

弱数据类型的安全问题 - 乐述云享 (aleshu.com)

【社群】PHP开发(安全问题) - 乐述云享 (aleshu.com)