最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解php比較操作符的安全問(wèn)題

 更新時(shí)間:2015年12月03日 11:52:56   投稿:mrr  
php的比較操作符有==(等于)松散比較,===(完全等于)嚴(yán)格比較,這里面就會(huì)引入很多有意思的問(wèn)題,本文給大家詳解php比較操作符的安全問(wèn)題,對(duì)php操作符相關(guān)資料感興趣的朋友一起學(xué)習(xí)吧

php的比較操作符有==(等于)松散比較,===(完全等于)嚴(yán)格比較,這里面就會(huì)引入很多有意思的問(wèn)題。

在松散比較的時(shí)候,php會(huì)將他們的類型統(tǒng)一,比如說(shuō)字符到數(shù)字,非bool類型轉(zhuǎn)換成bool類型,為了避免意想不到的運(yùn)行效果,應(yīng)該使用嚴(yán)格比較。如下是php manual上的比較運(yùn)算符表:

例子    名稱     結(jié)果
$a == $b  等于   TRUE,如果類型轉(zhuǎn)換后 $a 等于 $b。
$a === $b  全等   TRUE,如果 $a 等于 $b,并且它們的類型也相同。
$a != $b  不等   TRUE,如果類型轉(zhuǎn)換后 $a 不等于 $b。
$a <> $b  不等   TRUE,如果類型轉(zhuǎn)換后 $a 不等于 $b。
$a !== $b  不全等   TRUE,如果 $a 不等于 $b,或者它們的類型不同。
$a < $b   小與   TRUE,如果 $a 嚴(yán)格小于 $b。
$a > $b   大于   TRUE,如果 $a 嚴(yán)格大于 $b。
$a <= $b  小于等于   TRUE,如果 $a 小于或者等于 $b。
$a >= $b  大于等于   TRUE,如果 $a 大于或者等于 $b。

0x01 安全問(wèn)題

1 hash比較缺陷

php在處理hash字符串的時(shí)候會(huì)用到!=,==來(lái)進(jìn)行hash比較,如果hash值以0e開(kāi)頭,后邊都是數(shù)字,再與數(shù)字比較,就會(huì)被解釋成0*10^n還是為0,就會(huì)被判斷相等,繞過(guò)登錄環(huán)節(jié)。

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

當(dāng)全是數(shù)字的時(shí)候,寬松的比較會(huì)執(zhí)行盡力模式,如0e12345678會(huì)被解釋成0*10^12345678,除了e不全是數(shù)字的時(shí)候就不會(huì)相等,這能從var_dump("0e1234abc"=="0")可以看出來(lái)。

2 bool 欺騙

當(dāng)存在json_decode和unserialize的時(shí)候,部分結(jié)構(gòu)會(huì)被解釋成bool類型,也會(huì)造成欺騙。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");
}

運(yùn)行結(jié)果:

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");
}

運(yùn)行結(jié)果如下:

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

3 數(shù)字轉(zhuǎn)換欺騙

$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('<pre>' . mysql_error() . '</pre>' );
print_r(mysql_fetch_row($result));

將user_id=0.999999999999999999999發(fā)送出去得到結(jié)果如下:

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

本來(lái)是要查詢user_id的數(shù)據(jù),結(jié)果卻是user_id=0的數(shù)據(jù)。int和intval在轉(zhuǎn)換數(shù)字的時(shí)候都是就低的,再如下代碼:

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,就繞過(guò)了$_POST['uid']!=1的判斷,就能對(duì)uid=1的用戶進(jìn)行操作了。另外intval還有個(gè)盡力模式,就是轉(zhuǎn)換所有數(shù)字直到遇到非數(shù)字為止,如果采用:

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

攻擊者傳入123456 union select version()進(jìn)行攻擊。

4 PHP5.4.4 特殊情況

這個(gè)版本的php的一個(gè)修改導(dǎo)致兩個(gè)數(shù)字型字符溢出導(dǎo)致比較相等

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

3 題外話:

同樣有類似問(wèn)題的還有php strcmp函數(shù),manual上是這么解釋的,int strcmp ( string $str1 , string $str2 ),str1是第一個(gè)字符串,str2是第二個(gè)字符串,如果str1小于str2,返回<0,如果str1>str2,返回>0,兩者相等返回0,假如str2為一個(gè)array呢?

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

運(yùn)行結(jié)果:

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!

比較多種類型

運(yùn)算數(shù) 1 類型 運(yùn)算數(shù) 1 類型 結(jié)果
null  string string  NULL 轉(zhuǎn)換為 "",進(jìn)行數(shù)字或詞匯比較
bool  null 任何其它類型 轉(zhuǎn)換為 bool,FALSE < TRUE
object object 內(nèi)置類可以定義自己的比較,不同類不能比較,相同類和數(shù)組同樣方式比較屬性(PHP 4 中),PHP 5 有其自己的說(shuō)明
string,resource number string,resource number 將字符串和資源轉(zhuǎn)換成數(shù)字,按普通數(shù)學(xué)比較
array array 具有較少成員的數(shù)組較小,如果運(yùn)算數(shù) 1 中的鍵不存在于運(yùn)算數(shù) 2 中則數(shù)組無(wú)法比較,否則挨個(gè)值比較(見(jiàn)下例)
array 任何其它類型 array 總是更大
object 任何其它類型 object 總是更大

相關(guān)文章

  • ecshop 批量上傳(加入自定義屬性)

    ecshop 批量上傳(加入自定義屬性)

    ECSHOP的批量上傳功能沒(méi)有像shopex一下可以根據(jù)商品類型導(dǎo)出相應(yīng)的csv也就是說(shuō)批量上傳只能上傳一般的商品屬性,對(duì)于我們自己定義的特殊屬性我們還是要自己一個(gè)一個(gè)填過(guò)去
    2012-03-03
  • 分享六個(gè)比較好用的php數(shù)組Array函數(shù)

    分享六個(gè)比較好用的php數(shù)組Array函數(shù)

    這篇文章給大家分享六個(gè)比較好用的php數(shù)組Array函數(shù),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • PHP面向?qū)ο笾聞?wù)腳本模式(詳解)

    PHP面向?qū)ο笾聞?wù)腳本模式(詳解)

    下面小編就為大家?guī)?lái)一篇PHP面向?qū)ο笾聞?wù)腳本模式(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • php控制linux服務(wù)器常用功能 關(guān)機(jī) 重啟 開(kāi)新站點(diǎn)等

    php控制linux服務(wù)器常用功能 關(guān)機(jī) 重啟 開(kāi)新站點(diǎn)等

    服務(wù)器主機(jī)是CentOS 的,每次重啟、關(guān)機(jī)都得通過(guò)客戶端連接,想問(wèn)下能否通過(guò)PHP頁(yè)面實(shí)現(xiàn)對(duì)系統(tǒng)的 關(guān)機(jī)、重啟操作
    2012-09-09
  • YII2框架實(shí)現(xiàn)表單中上傳單個(gè)文件的方法示例

    YII2框架實(shí)現(xiàn)表單中上傳單個(gè)文件的方法示例

    這篇文章主要介紹了YII2框架實(shí)現(xiàn)表單中上傳單個(gè)文件的方法,結(jié)合實(shí)例形式分析了YII2框架表單提交與文件上傳相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • PHPStrom 新建FTP項(xiàng)目以及在線操作教程

    PHPStrom 新建FTP項(xiàng)目以及在線操作教程

    PhpStorm是一個(gè)輕量級(jí)且便捷的PHP IDE,其提供的智能代碼補(bǔ)全,快速導(dǎo)航以及即時(shí)錯(cuò)誤檢查等功能大大提高了編碼效率。它是一款商業(yè)的 PHP 集成開(kāi)發(fā)工具,以其獨(dú)特的開(kāi)發(fā)便利性,短時(shí)間內(nèi)贏得了大量PHPer的青睞。今天我們來(lái)詳細(xì)學(xué)習(xí)下FTP相關(guān)的操作
    2016-10-10
  • php中刪除、清空session的方式總結(jié)

    php中刪除、清空session的方式總結(jié)

    php中刪除session的方式有很多種,本篇文章主要給大家介紹三種清空session的方式,感興趣的朋友跟著小編一起學(xué)習(xí)吧
    2015-10-10
  • thinkphp5 加載靜態(tài)資源路徑與常量的方法

    thinkphp5 加載靜態(tài)資源路徑與常量的方法

    這篇文章主要介紹了thinkphp5 加載靜態(tài)資源路徑與常量的方法的相關(guān)資料,需要的朋友可以參考下
    2017-12-12
  • CI(Codeigniter)的Setting增強(qiáng)配置類實(shí)例

    CI(Codeigniter)的Setting增強(qiáng)配置類實(shí)例

    這篇文章主要介紹了Codeigniter的Setting增強(qiáng)配置類,結(jié)合實(shí)例形式較為詳細(xì)的分析了Codeigniter增強(qiáng)配置類的具體實(shí)現(xiàn)步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • laravel框架創(chuàng)建授權(quán)策略實(shí)例分析

    laravel框架創(chuàng)建授權(quán)策略實(shí)例分析

    這篇文章主要介紹了laravel框架創(chuàng)建授權(quán)策略,結(jié)合實(shí)例形式分析了laravel框架創(chuàng)建授權(quán)策略的相關(guān)步驟、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11

最新評(píng)論

黑山县| 永寿县| 子长县| 印江| 兰坪| 太仆寺旗| 利辛县| 南安市| 太仆寺旗| 弥勒县| 望江县| 神木县| 耒阳市| 铜川市| 菏泽市| 合江县| 外汇| 青州市| 米易县| 永善县| 瓦房店市| 太谷县| 永新县| 永寿县| 辉县市| 射洪县| 盘锦市| 武功县| 扶沟县| 大安市| 子长县| 余干县| 贵州省| 澄江县| 嘉鱼县| 上杭县| 长子县| 宾川县| 宜丰县| 濮阳县| 乐业县|