intval函数有个特性:直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换
PHP_FUNCTION(intval) // intval函数处理的流程 { zval **num, **arg_base; int base; switch (ZEND_NUM_ARGS()) { //判断传参的个数 case 1: if (zend_get_parameters_ex(1, &num) == FAILURE) { WRONG_PARAM_COUNT; } base = 10; // base为10 break; case 2: if (zend_get_parameters_ex(2, &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, 1, 0); convert_to_long_base(return_value, base); //重点convert_to_long_base中的处理 }
Zend/zend_operators.c->>convert_to_long_base() …… case IS_STRING: strval = Z_STRVAL_P(op); Z_LVAL_P(op) = strtol(strval, NULL, base); // strtol()会扫描字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换,并将结果返回。 STR_FREE(strval); break;
当intval用在if等的判断里面,将会导致这个判断失去意义!
<?php //intval.php $var="20070601"; if (intval($var)) echo "it's safe"; echo ' $var='.$var; echo "<br>"; $var1="1 union select 1,1,1 from admin"; if (intval($var1)) echo "it's safe too"; echo ' $var1='.$var1; ?>
学习文章:https://github.com/80vul/phpcodz/blob/master/research/pch-001.md
来源:https://www.cnblogs.com/zpchcbd/p/12653780.html