熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

php內置函數intval()

2013-11-15 12:27:31  來源: PHP編程 
描述

  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等的判斷裡面將會導致這個判斷實去意義從而導致安全漏洞

  三測試代碼

  //intvalphp

  $var=;

  if (intval($var))

  echo its safe;

  echo $var=$var;

  echo

  ;

  $var= union select from admin;

  if (intval($var))

  echo its safe too;

  echo $var=$var;

  四實際應用

WordPress <= wptrackbackphp Zend_Hash_Del_Key_Or_Index / sql injection exploit
From:http://tw.wingwit.com/Article/program/PHP/201311/20990.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.