千家信息网

php比较操作符的安全问题

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"php比较操作符的安全问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php的比较
千家信息网最后更新 2026年11月01日php比较操作符的安全问题

本篇内容介绍了"php比较操作符的安全问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

php的比较操作符有==(等于)松散比较,===(完全等于)严格比较,这里面就会引入很多有意思的问题。

在松散比较的时候,php会将他们的类型统一,比如说字符到数字,非bool类型转换成bool类型,为了避免意想不到的运行效果,应该使用严格比较。如下是php manual上的比较运算符表:

例子    名称     结果$a == $b  等于   TRUE,如果类型转换后 $a 等于 $b。$a === $b  全等   TRUE,如果 $a 等于 $b,并且它们的类型也相同。$a != $b  不等   TRUE,如果类型转换后 $a 不等于 $b。$a <> $b  不等   TRUE,如果类型转换后 $a 不等于 $b。$a !== $b  不全等   TRUE,如果 $a 不等于 $b,或者它们的类型不同。$a < $b   小与   TRUE,如果 $a 严格小于 $b。$a > $b   大于   TRUE,如果 $a 严格大于 $b。$a <= $b  小于等于   TRUE,如果 $a 小于或者等于 $b。$a >= $b  大于等于   TRUE,如果 $a 大于或者等于 $b。

0x01 安全问题

1 hash比较缺陷

php在处理hash字符串的时候会用到!=,==来进行hash比较,如果hash值以0e开头,后边都是数字,再与数字比较,就会被解释成0*10^n还是为0,就会被判断相等,绕过登录环节。

root@kali:~/tool# php -r 'var_dump("00e0345" == "0");var_dump("0e123456789"=="0");var_dump("0e1234abc"=="0");'
bool(true)
bool(true)
bool(false)

当全是数字的时候,宽松的比较会执行尽力模式,如0e12345678会被解释成0*10^12345678,除了e不全是数字的时候就不会相等,这能从var_dump("0e1234abc"=="0")可以看出来。

2 bool 欺骗

当存在json_decode和unserialize的时候,部分结构会被解释成bool类型,也会造成欺骗。json_decode示例代码:

$json_str = '{"user":true,"pass":true}';$data = json_decode($json_str,true);if ($data['user'] == 'admin' && $data['pass']=='secirity'){  print_r('logined in as bool'."\n");}

运行结果:

root@kali:/var/www# php /root/php/hash.php
logined in as bool

unserialize示例代码:

$unserialize_str = 'a:2:{s:4:"user";b:1;s:4:"pass";b:1;}';$data_unserialize = unserialize($unserialize_str);if ($data_unserialize['user'] == 'admin' && $data_unserialize['pass']=='secirity'){  print_r('logined in unserialize'."\n");}

运行结果如下:

root@kali:/var/www# php /root/php/hash.php
logined in unserialize

3 数字转换欺骗

$user_id = ($_POST['user_id']);if ($user_id == "1"){  $user_id = (int)($user_id);  #$user_id = intval($user_id);  $qry = "SELECT * FROM `users` WHERE user_id='$user_id';";}$result = mysql_query($qry) or die('
' . mysql_error() . '
' );print_r(mysql_fetch_row($result));

将user_id=0.999999999999999999999发送出去得到结果如下:

Array
(
[0] => 0
[1] => lxx'
[2] =>
[3] =>
[4] =>
[5] =>
)

本来是要查询user_id的数据,结果却是user_id=0的数据。int和intval在转换数字的时候都是就低的,再如下代码:

if ($_POST['uid'] != 1) { $res = $db->query("SELECT * FROM user WHERE uid=%d", (int)$_POST['uid']); mail(...);} else { die("Cannot reset password of admin");}

假如传入1.1,就绕过了$_POST['uid']!=1的判断,就能对uid=1的用户进行操作了。另外intval还有个尽力模式,就是转换所有数字直到遇到非数字为止,如果采用:

if (intval($qq) === '123456'){  $db->query("select * from user where qq = $qq")}

攻击者传入123456 union select version()进行攻击。

4 PHP5.4.4 特殊情况

这个版本的php的一个修改导致两个数字型字符溢出导致比较相等

$ php -r 'var_dump("61529519452809720693702583126814" == "61529519452809720000000000000000");'
bool(true)

3 题外话:

同样有类似问题的还有php strcmp函数,manual上是这么解释的,int strcmp ( string $str1 , string $str2 ),str1是第一个字符串,str2是第二个字符串,如果str1小于str2,返回<0,如果str1>str2,返回>0,两者相等返回0,假如str2为一个array呢?

$_GET['key'] = array();$key = "llocdpocuzion5dcp2bindhspiccy";$flag = strcmp($key, $_GET['key']);if ($flag == 0) {  print "Welcome!";} else {  print "Bad key!";}

运行结果:

root@kali:~/php# php strcmp.php
PHP Warning: strcmp() expects parameter 2 to be string, array given in /root/php/strcmp.php on line 13
Welcome!

比较多种类型

运算数 1 类型运算数 1 类型结果
null 或 stringstring将 NULL 转换为 "",进行数字或词汇比较
bool 或 null任何其它类型转换为 bool,FALSE < TRUE
objectobject内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明
string,resource或 numberstring,resource或 number将字符串和资源转换成数字,按普通数学比较
arrayarray具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)
array任何其它类型array 总是更大
object任何其它类型object 总是更大

"php比较操作符的安全问题"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

类型 数字 结果 字符 时候 问题 运算 字符串 解释 运行 安全 操作符 代码 数组 松散 相同 内容 情况 数据 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 上海喔噻互联网科技有限公司 互联网科技工作委员会副主任毛军 关于新基建和互联网科技 为想互联网科技 电子科技大学互联网 广州凡科互联网科技 互联网高科技股票 互联网科技创新企业排名 山东吉时兔互联网科技有限公司 上海电发互联网科技有限公司 互联网大会黑科技排名 互联网金融科技元年 黑云互联网科技有限公司 兰石爱特工业互联网科技分公司 互联网科技品牌 科技互联网专业工作会议发言稿 华人运通互联网科技公司 互联网科技企业文化 小牛互联网科技有限公司地址 互联网科技园 互联网科技公司经营范围 互联网金融 金融科技 善班互联网科技有限公司 哈尔滨新华互联网科技 辽宁互联网新科技 滨湖区互联网智能科技产品有哪些 美国互联网科技公司 保山浩联互联网科技有限公司 互联网领先科技成果宣传视频
0