诚信为本,市场在变,诚信永远不变... 设为首页|加入收藏|联系我们
24小时咨询热线

020-88888888

新闻资讯NEWS

联系我们contact us

地址: 广东省广州市

座机:020-88888888

联系人:李生

手机:13888888888

邮箱:@online-kaiyun-194.com

新闻资讯

您现在的位置是: 首页 > 新闻资讯

浅谈PHP弱类型安全:比较操作符及引发的漏洞案例总结

PHP里头,类型比较具备的细微差别,常常会致使那些开发者,陷入到难以察觉到的陷阱之中,进而引发严重的安全方面的漏洞。

松散比较的强制转换

PHP的那种松散比较运算符“==”,在比较之前会去尝试统一类型,它是会依据一套内置的规则去做这件事的,也就是将不同类型的数据进行自动转换,比如说字符串在和数字进行比较的时候,会去尝试转换成数字 。

有一个典型规则,那就是,字符串起始的部分会被提取当作数字。字符串“123abc”将会被转变成整数123。要是字符串并非以数字开头,像“abc123”这样,转换的结果便是0。这种自动的行为是诸多问题产生的源头。

严格比较的类型检查

1. 与“==”相反, 2. 恒等运算符“===”进行严格比较, 3. 它不但查看值是否相等, 4. 还需要两个操作数的类型完全一样, 5. 整数1和字符串“1”在“===”的情况下是不相等的。

行为是严格比较,这种行为极其明确,不存在隐含的类型转换,所以结果的可预测性更强。在安全性要求高的场景当中,像是校验用户的身份或者密钥,始终都是推荐运用严格比较去避免意外情况的发生。

数字字符串的转换陷阱

用于字符串数字转换的规则,于实际应用里会致使混乱,举例来说,有字符串“0e123”这呈现在数学意思上是0乘10的123次之方,其得出的数值是0,于松散比较当中,“0e123”跟整数0是等同的。

更为复杂的是,字符串“0.0”,在empty()函数里,不被当作空值,字符串“0.”,于empty()函数中,同样不被视作空值,然而,当与整数0进行“==”比较时,结果却是真,这样的特性,常常会被攻击者利用,用以绕过逻辑判断。

弱类型导致的认证绕过

于找回密码之类功能里,时常得要去比对用户所提交上去的答案跟预设好的答案。一旦代码运用的是松散比较,那么便极有可能出现被绕过的状况。攻击者提交诸如“0”或者“0e123”这样的字符串,就有可能致使校验得以通过。

2020年,有一个CMS系统,它在安全问题校验里使用了“==”,于此缘由导致攻击者能够构造特定输入,进而重置任意用户密码。这类漏洞的关键所在是开发者并没有意识到不同类型数据进行比较的时候存在隐式转换。

SQL注入中的类型利用

需要整数型参数$id才能进入特定分支的代码,有可能因弱类型特性而受到SQL注入影响 ,对于SQL注入而言,参数$id得是字符串才行 。攻击者借助“==”的某些特性 ,能够传入“2 union select...”这样的值 。

由于在松散比较里,字符串“2”等同于整数2,代码便会进入目标分支,与此同时,后续的SQL查询会把它当作完整字符串来处理,进而执行注入的恶意代码,这是把类型缺陷转化成安全漏洞的典型示例 。

防范措施与最佳实践

最根本的防范举措是,于所有需要明确判定的地方,运用“===”以及“!==”展开严格比对,如此能够完全杜绝因类型转变所带来的不确定性,尤其是在开展身份、密码或者关键参数校验之际。

在接收到使用者输入之后,应当运用intval()、strval()这类函数去开展显式的类型转换,并非依靠PHP自行处理,除此之外,开启严格模式(declare(strict_types=1))能够要求函数参数以及返回值类型精准匹配,进而进一步强化代码健壮性 。

于您在开展开发进程期间,有无曾因类型进行比较方面的问题进而调试了相当长的时间,又或者是遭遇到借由其引发的处于线上的故障?诚挚欢迎于评论区域分享您所拥有的经历以及应对的策略出来。要是感觉这篇文章具备一定帮助作用的话,请通过点赞予以支持。

在线客服

关注我们 在线咨询 投诉建议 返回顶部