国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > PHP > 正文

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

2024-05-04 21:48:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文章先來(lái)介紹了php intval簡(jiǎn)單用法,它可以把字符,數(shù)字,小數(shù)轉(zhuǎn)換灰數(shù)字型數(shù)據(jù),但在轉(zhuǎn)換時(shí)會(huì)出現(xiàn)一些問(wèn)題如小數(shù)1.1就會(huì)轉(zhuǎn)換成1,下面看實(shí)例.

一、變量轉(zhuǎn)成整數(shù)類型.

語(yǔ)法:int intval(mixed var, int [base]);

返回值:整數(shù)

函數(shù)種類:PHP 系統(tǒng)功能

內(nèi)容說(shuō)明:本函數(shù)可將變量轉(zhuǎn)成整數(shù)類型,可省略的參數(shù) base 是轉(zhuǎn)換的基底,默認(rèn)值為 10,轉(zhuǎn)換的變量 var 可以為數(shù)組或類之外的任何類型變量.

intval()使用不當(dāng)?shù)陌踩┒捶治?/p>

intval函數(shù)有個(gè)特性:”直到遇上數(shù)字或正負(fù)符號(hào)才開(kāi)始做轉(zhuǎn)換,再遇到非數(shù)字或字符串結(jié)束時(shí)()結(jié)束轉(zhuǎn)換”,在某些應(yīng)用程序里由于對(duì)intval函數(shù)這個(gè)特性認(rèn)識(shí)不夠,錯(cuò)誤的使用導(dǎo)致繞過(guò)一些安全判斷導(dǎo)致安全漏洞.

二、分析,代碼如下:

  1. PHP_FUNCTION(intval
  2.  
  3.  
  4. zval **num, **arg_base; 
  5.  
  6. int base; 
  7.  
  8.  
  9. switch (ZEND_NUM_ARGS()) { 
  10.  
  11. case 1: 
  12.  
  13. if (zend_get_parameters_ex(1, &num) == FAILURE) { 
  14.  
  15. WRONG_PARAM_COUNT; 
  16.  
  17.  
  18. base = 10; 
  19.  
  20. break
  21.  
  22. case 2: 
  23.  
  24. if (zend_get_parameters_ex(2, &num, &arg_base) == FAILURE) { 
  25.  
  26. WRONG_PARAM_COUNT; 
  27.  
  28.  
  29. convert_to_long_ex(arg_base); 
  30.  
  31. base = Z_LVAL_PP(arg_base); 
  32.  
  33. break
  34.  
  35. default
  36.  
  37. WRONG_PARAM_COUNT; 
  38.  
  39.  
  40. RETVAL_ZVAL(*num, 1, 0); 
  41.  
  42. convert_to_long_base(return_value, base); 
  43.  
  44.  
  45. Zend/zend_operators.c->>convert_to_long_base() 
  46.  
  47. …… 
  48.  
  49. case IS_STRING
  50.  
  51. strval = Z_STRVAL_P(op); 
  52.  
  53. Z_LVAL_P(op) = strtol(strval, NULL, base); 
  54. //開(kāi)源代碼Vevb.com 
  55. STR_FREE(strval); 
  56.  
  57. break

當(dāng)intval函數(shù)接受到字符串型參數(shù)是調(diào)用convert_to_long_base()處理,接下來(lái)調(diào)用Z_LVAL_P(op) = strtol(strval, NULL, base);通過(guò)strtol函數(shù)來(lái)處理參數(shù).

函數(shù)原型如下:long int strtol(const char *nptr,char **endptr,int base);

這個(gè)函數(shù)會(huì)將參數(shù)nptr字符串根據(jù)參數(shù)base來(lái)轉(zhuǎn)換成長(zhǎng)整型數(shù),參數(shù)base范圍從2至36,或0.參數(shù)base代表采用的進(jìn)制方式,如base值為10則采用10進(jìn)制,若base值為16則采用16進(jìn)制等.

流程為:strtol()會(huì)掃描參數(shù)nptr字符串,跳過(guò)前面的空格字符,直到遇上數(shù)字或正負(fù)符號(hào)才開(kāi)始做轉(zhuǎn)換,再遇到非數(shù)字或字符串結(jié)束時(shí)()結(jié)束轉(zhuǎn)換,并將結(jié)果返回.

 
那么當(dāng)intval用在if等的判斷里面,將會(huì)導(dǎo)致這個(gè)判斷實(shí)去意義,從而導(dǎo)致安全漏洞.

三、測(cè)試代碼,代碼如下:

  1. <?php 
  2. $o = 0.1; 
  3. for($a = 1; $a < 100; $a++){ 
  4. $o += 0.1; 
  5. echo “<br />intval($o) = “.intval($o); 
  6. if(intval($o)){ 
  7. print(“&nbsp;true”); 
  8. }else
  9. print(“&nbsp;false”); 
  10. }?> 
  11. /* 
  12. 輸出結(jié)果: 
  13. intval(0.2) = 0 false 
  14. intval(0.3) = 0 false 
  15. intval(0.4) = 0 false 
  16. intval(0.5) = 0 false 
  17. intval(0.6) = 0 false 
  18. intval(0.7) = 0 false 
  19. intval(0.8) = 0 false 
  20. intval(0.9) = 0 false 
  21. intval(1) = 0 false 
  22. intval(1.1) = 1 true 
  23. intval(1.2) = 1 true 
  24. intval(1.3) = 1 true 
  25. intval(1.4) = 1 true 
  26. intval(1.5) = 1 true 
  27. intval(1.6) = 1 true 
  28. intval(1.7) = 1 true 
  29. intval(1.8) = 1 true 
  30. intval(1.9) = 1 true 
  31. intval(2) = 2 true 
  32. ….. 
  33. */ 

php intval 與 int 的區(qū)別,代碼如下:

  1. $t ='165'
  2.  
  3. echo gettype((int)($t)); 
  4. echo '<hr>'
  5. echo gettype(intval($t)); 
  6.  
  7. //輸出結(jié)果:integer integer value:165 
  8.  
  9.  
  10. $t ='a165'
  11.  
  12. echo gettype((int)($t)); 
  13. echo '<hr>'
  14. echo gettype(intval($t)); 
  15.  
  16. //結(jié)果 integer integer value:0,0 
  17.  
  18. $string="2a";  
  19. $string1=intval($string);  
  20. echo '$string1的值:'.$string1.'$string2的值:';//單引號(hào)不會(huì)輸出變量,將原樣輸出  
  21. $string2=(int)($string);  
  22. echo $string2 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中江县| 龙井市| 扎囊县| 宁河县| 阿图什市| 明星| 仁寿县| 佛教| 荆门市| 攀枝花市| 沽源县| 尚义县| 体育| 久治县| 贞丰县| 诸暨市| 和硕县| 永善县| 通榆县| 中牟县| 贡山| 阳信县| 嘉义市| 通河县| 垦利县| 平塘县| 康乐县| 兴安盟| 万州区| 南华县| 福贡县| 洪江市| 台南市| 潮安县| 来宾市| 泰和县| 玉田县| 鹤峰县| 兴海县| 高清| 宝兴县|