一、md5加密漏洞
当比较哈希字符串时,如果哈希值是以 “0x” 开头的格式,PHP 会错误地将其解释为科学计数法0的多少次方,恒为0(实际上不应该这样解释) 因此,md5加密是有几率将两个不同的字符串,加密后的值是相同的,这种情况称为哈希碰撞 如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了
<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
echo json_encode([
'md5_str1' => md5($str1),
'md5_str2' => md5($str2)
]);
结果如下:
md5_str1: "0e545993274517709034328855841020"
md5_str2: "0e848240448830537924465865611904"
这个数都是以0e开头,看起来好像没有问题,我们再进行一次发现
<?php
$str1 = 's878926199a';
$str2 = 's214587387a';
echo json_encode([
'md5_str1' => md5($str1),
'md5_str2' => md5($str2),
'bool' => md5($str1) == md5($str2)//比较一下这两个值是否相等
]);
结果如下:
{
md5_str1: "0e545993274517709034328855841020",
md5_str2: "0e848240448830537924465865611904",
bool: true
}
这两个字符串都以 0e 开头,在进行松散比较时,PHP 会尝试将它们作为科学计数法的数字来处理。而以 0e 开头的这种形式在被当作科学计数法数字处理时,其值都会被认为是 0
这意味着,若网站用户密码加密后恰以 0e 开头,黑客便可能利用此漏洞轻松攻破系统,窃取用户信息或进行恶意操作。
二、intval()函数漏洞
intval()是一个 PHP 函数,它的主要作用是获取变量的整数值。
-
PHP作为弱类型语言,类型转换的时候,会有很大漏洞
-
这个函数对字符串也能使用,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0
<?php
var_dump(intval('2.2')); //2
var_dump(intval('3abcd')); //3
var_dump(intval('a3bcd')); //0
var_dump(intval('abcd')); //0
结果如下:
int(2)
int(3)
int(0)
int(0)
因此我们使用intval()这个函数的时候一定要格外注意。
三、Switch漏洞
switch中是先将类型转为整形,再进行判断 这个转换和 intval 一样,从字符串非整形的地方截止转换,无法转换将会返回0
<?php
$i ="abc";
switch ($i) {
case 'a':
case 'b':
case 'abc':
case 0:
echo "i等于0";
break;
case 1:
echo "i等于1";
}
结果如下:
i等于0
上述代码中,由于 $i 的值为 "abc",转换为整形后为 0,故而匹配到 case 0 分支,输出 “i 等于 0”。这种隐式转换可能使程序流程偏离预期,成为安全漏洞的温床。
四、in_array()漏洞
- in_array中是先将类型转为整形,再进行判断
- 转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0
<?php
var_dump(in_array("2%20and%20%", [0,2,3]));
结果如下:
bool(true)
不严谨的转换机制可能使攻击者利用特殊字符串绕过数组元素的安全检查,从而造成数据泄露或恶意操作。
五、is_numeric()漏洞
is_numeric()是 PHP 中的一个函数,用于判断一个变量是否为数字或数字字符串。
- 会忽视0x这种十六进制的数
- 容易引发sql注入操作,暴漏用户的敏感信息
echo is_numeric(233333);
echo is_numeric('233333');
echo is_numeric(0x233333);
echo is_numeric('0x233333');
echo is_numeric('233333abc');
结果如下:
true
true
true
false
false
开发人员在使用该函数进行数据验证时,若未考虑到这一漏洞,可能使恶意输入轻易绕过验证环节,引发严重安全事故。
六、总结
综上所述,PHP 开发人员在使用这些函数时,必须充分认识到其潜在漏洞,采取严谨的安全策略与数据验证机制,如对用户输入进行严格过滤与校验、采用更安全的加密算法与数据存储方式等,以确保系统安全稳定运行,切实保护用户数据与隐私免受侵害。