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

020-88888888

新闻资讯NEWS

联系我们contact us

地址: 广东省广州市

座机:020-88888888

联系人:李生

手机:13888888888

邮箱:@online-kaiyun-194.com

新闻资讯

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

浅谈php弱类型安全:类型转换及相关安全问题实例解析

PHP有着弱类型设计,这确实提升了开发效率,然而在安全领域层面来看,却极有可能给攻击者开启便利之门,问题在于其隐式的类型转换会经常致使出现意想不到的逻辑漏洞 。

弱类型比较的风险

PHP于运用双等号开展比较之际,要是两边类型存有差异,它会试着实施类型转变之后再展开比较。举例来讲,当字符串“123abc”跟数字123进行比较时,字符串会被转变成数字123,最终结果返回为真。这样一种宽松的比较形式,有可能致使程序出现错误的判定。

于用户身份验证之类场景当中,要是开发者运用“==”去判定用户所输入的密码哈希值,那么便存在可能会被绕过的情况。攻击者能够构建特定的字符串,经转换为数字后使之与目标值等同。这样的风险促使开发者于开展关键判断之际,务必得采用严格比较符“===” 。

科学计数法解析问题

PHP会把那种形如“0e12345”的字符串解析成用科学计数法表示的数值零,这在比较运算里会引发严重问题,比如,两个不一样的MD5哈希值,要是都以“0e”开头,后面全是数字,在弱类型比较时会被判定为相等 。

之所以这两个字符串均会被转变为数值0,是存在真实漏洞案例的,攻击者借助此特性找出了两MD5值皆是以“0e”起始的各异密码,进而绕过了后台的密码校验,这类问题彰显出对哈希值开展严格比较的必要性。

十六进制字符串的转换

当字符串起始于“0x”时,PHP于数值上下文里会把它阐释成十六进制数字。在SQL查询拼接之际,要是用户输入的ID参数是“0x31”(也就是十进制的49),程序仰仗弱类型判定其是不是数字,结果为真,就会把它引入数据库查询。

MySQL数据库于处理之际时,有可能会把此十六进制数剖析为相对应的字符串或者数字,致使实际所执行的查询跟开发者预先期待的情形有所不同,这兴许会引发数据方面的误操作或者注入漏洞等状况。关键的环节务必要针对输入实施显式的类型检查以及过滤。

数组传入哈希函数

当对数组进行传递,把它给到像md5()或者sha1()这类哈希函数的时候,PHP不会去抛出错误,而是返回NULL。要是在这当中攻击者同时对两个用来比较的值都实施了控制,并且把这两个值都设置成数组,那么md5($a) == md5($b)这样的判断就会成立,原因是NULL等于NULL 。

于某些找回密码或者身份校验的逻辑里头,要是借助此特性,攻击者不用晓得真实的哈希值便可经由验证。防范的举措是在调用这些函数之前,务必要确认参数是字符串类型,或者径直运用严格比较去检查哈希结果 。

in_array函数的陷阱

该情况表明,in_array()此函数于默认状况下运用的系那种较为松散的比较方式,这就意味着当在那个包含[0,1,2]这些元素于此数组之中去搜寻那个字符串“abc”的时候,函数会先把“abc”进行转换从而变为整数0 ,接着在数组里找到0 ,进而返回真 ,而这有可能致使黑名单或者白名单相应的检查所以被轻松绕过 ,出现这种状况 。

可将该函数的第三个参数设置成true,以此开启严格模式,且同时要比较值和类型。在涉及安全检查之际,务必要启用严格模式。开发者应当养成习惯,认真仔细查阅手册知晓明确每个函数在类型处理方面的默认行为 。

类型转换与二次注入

原先的输入过滤兴许会因类型转换而失去效用,举例来说,程序把用户输入的十六进制字符串判定成数字后予以放行,并且把它存放进数据库里,然而数据在库中是以原始字符串的形式被存储的,当另外一个功能从数据库中将该数据取出来再度使用时,就有可能引发二次注入。

在整个攻击链条里面,要是单一环节上的类型转换判断出现失误,那么就会被后续的环节进行放大,这是有要求的,安全防护必须得贯彻到整个数据处理流程当中,这话的意思是,包括输入验证、查询参数化、存储过程,特别是输出前的再检查几个方面,绝对不可以仅仅依赖单一的防御点。 。

在你进行开发期间,有无因为弱类型比较此情况,而碰见过那种特别难以去调试的程序漏洞问题,或是那种涉及安全方面的问题?要是你认为文本这个有着用处,那就麻烦点个赞,并且分享给更多做开发的朋友,同时欢迎在评论区域分享你的经历以及解决办法。

在线客服

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