常见的PHP脚本漏洞漏洞修复之基础篇

文章详细阐述了PHP作为弱类型语言在处理数据时可能出现的安全问题,包括MD5加密的哈希碰撞,is_numeric函数对16进制数的误判可能导致SQL注入,in_array的类型转换漏洞,以及switch语句中的类型转换隐患。这些问题提醒开发者在编码时需注意类型检查和安全实践。
摘要由CSDN通过智能技术生成

​ 古人学问遗无力,少壮功夫老始成 〞:因为PHP是弱类型语言,所以内置的很多函数,在进行转换和比较的时候,会有各种漏洞需要格外关注。不然很容易在安全上造成各种各样的漏洞,当然平时可能问题不会显现,但是如果人家恶意攻击,这将首当其冲,必然安全部门首先让你来背锅,所以代码能严格就要严格,尽量在平时养成良好的习惯

01

md5加密漏洞

比较哈希字符串的时候,php程序把每一个以“0x”开头的哈希值都解释为科学计数法0的多少次方,恒为0。

所以如果两个不同的密码经过哈希以后,其哈希值都是以“0e”开头的,那么php将会认为他们相同。

另外md5加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞。

<?php$str1 = 's878926199a';
$str2 = 's214587387a'; 
echo json_encode([ 'md5_str1' => md5($str1), 'md5_str2' => md5($str2), 'bool' => md5($str1) == md5($str2)
]);

结果两个值加密后竟然相等。

缺点你懂的,如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了。

{ md5_str1: "0e545993274517709034328855841020", md5_str2: "0e848240448830537924465865611904", bool: true
}

02

is_numeric漏洞

会忽视0x这种十六进制的数

容易引发sql注入操作,暴露敏感信息

echo json_encode([
 is_numeric(233333),
 is_numeric('233333'),
 is_numeric(0x233333),
 is_numeric('0x233333'),
 is_numeric('233333abc'),
]);

结果如下:

16进制数0x61646D696EASII码对应的值是admin。

如果我们执行了后面这条命令的话:SELECT * FROM tp_user where username=0x61646D696E,结果不言而喻

[ true, true, true, false, false]

03

in_array漏洞

in_array中是先将类型转为整形,再进行判断。

PHP作为弱类型语言,类型转换的时候,会有很大漏洞。

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。

<?phpvar_dump(in_array("2%20and%20%", [0,2,3]));

结果如下:

bool(true)

04

switch漏洞

switch中是先将类型转为整形,再进行判断。

PHP作为弱类型语言,类型转换的时候,会有很大漏洞。

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。

<?php$i ="abc";switch ($i) { case 0: case 1: case 2: echo "i是比3小的数"; break; case 3: echo "i等于3";
}

结果如下:

i是比3小的数。

05

intval强转漏洞

PHP作为弱类型语言,类型转换的时候,会有很大漏洞。

转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。

<?phpvar_dump(intval('2')); //2var_dump(intval('3abcd')); //3var_dump(intval('abcd')); //0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执刀人的工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值