熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

php intval() 小數時安全漏洞分析

2013-11-23 19:25:18  來源: Java核心技術 
變量轉成整數類型
   
    語法 int intval(mixed var int [base])
   
    返回值 整數
   
    函數種類 PHP 系統功能
   
內容說明
   
    本函數可將變量轉成整數類型可省略的參數 base 是轉換的基底默認值為 轉換的變量 var 可以為數組或類之外的任何類型變量
   
intval()使用不當的安全漏洞分析
   
    intval函數有個特性直到遇上數字或正負符號才開始做轉換再遇到非數字或字符串結束時()結束轉換在某些應用程序裡由於對intval函數這個特性認識不夠錯誤的使用導致繞過一些安全判斷導致安全漏洞
   
分析
   
    代碼如下 復制代碼
   
    PHP_FUNCTION(intval)
   
    {
   
    zval **num **arg_base;
   
    int base;
   
    switch (ZEND_NUM_ARGS()) {
   
    case :
   
    if (zend_get_parameters_ex( &num) == FAILURE) {
   
    WRONG_PARAM_COUNT;
   
    }
   
    base = ;
   
    break;
   
    case :
   
    if (zend_get_parameters_ex( &num &arg_base) == FAILURE) {
   
    WRONG_PARAM_COUNT;
   
    }
   
    convert_to_long_ex(arg_base)
   
    base = Z_LVAL_PP(arg_base)
   
    break;
   
    default:
   
    WRONG_PARAM_COUNT;
   
    }
   
    RETVAL_ZVAL(*num
   
    convert_to_long_base(return_value base)
   
    }
   
    Zend/zend_operatorsc》convert_to_long_base()
   
    ……
   
    case IS_STRING:
   
    strval = Z_STRVAL_P(op)
   
    Z_LVAL_P(op) = strtol(strval NULL base)
   
    STR_FREE(strval)
   
    break;
   
    當intval函數接受到字符串型參數是調用convert_to_long_base()處理接下來調用Z_LVAL_P(op) = strtol(strval NULL base)通過strtol函數來處理參數
   
函數原型如下
   
    long int strtol(const char *nptrchar **endptrint base)
   
    這個函數會將參數nptr字符串根據參數base來轉換成長整型數參數base范圍從參數base代表采用的進制方式如base值為則采用進制若base值為則采用進制等
   
    流程為
   
    strtol()會掃描參數nptr字符串跳過前面的空格字符直到遇上數字或正負符號才開始做轉換再遇到非數字或字符串結束時()結束轉換並將結果返回
   
    那麼當intval用在if等的判斷裡面將會導致這個判斷實去意義從而導致安全漏洞



    三測試代碼
   
    代碼如下 復制代碼
   
    <?php
   
    $o = ;
   
    for($a = ; $a < ; $a++){
   
    $o += ;
   
    echo <br />intval($o) = intval($o)
   
    if(intval($o)){
   
    print(&nbsp;true
   
    }else{
   
    print(&nbsp;false
   
    }
   
    }?>
   
輸出結果
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = false
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    intval() = true
   
    ……
   
php intval 與 int 的區別
   
    代碼如下 復制代碼
   
    $t =;
   
    echo gettype((int)($t))
   
    echo <hr>;
   
    echo gettype(intval($t))
   
    //輸出結果integer integer value:
   
    $t =a;
   
    echo gettype((int)($t))
   
    echo <hr>;
   
    echo gettype(intval($t))
   
    //結果 integer integer value:
   
    $string=a;
   
    $string=intval($string)
   
    echo $string的值$string$string的值;//單引號不會輸出變量將原樣輸出
   
    $string=(int)($string)
   
    echo $string


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26835.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.