この記事ではまず、文字、数値、小数点を灰色の数値データに変換できる php intval の簡単な使い方を紹介します。たとえば、10 進数の 1.1 は 1 に変換されます。以下の例を参照してください。
変数を整数型に変換します。
構文: int intval(mixed var, int [base]);
戻り値: 整数
関数の種類: PHPシステム関数
コンテンツの説明
この関数は変数を整数型に変換できます。省略されたパラメータのbaseは変換のベースとなり、デフォルト値は10です。変換された変数 var は、配列またはクラスを除く任意の型の変数にすることができます。
intval() の不正使用のセキュリティ脆弱性分析
intval 関数には、「数値または正または負の符号が出現するまで変換は開始されず、一部のアプリケーションでは非数値または文字列の終わり () が出現すると変換が終了する」という特性があります。 intval 関数のこの機能についての理解が不十分なため、誤った使用は一部のセキュリティ判断を回避し、セキュリティの脆弱性につながる可能性があります。
2.分析
コードは次のとおりです | コードをコピー |
PHP_FUNCTION(intval) { zval **num、**arg_base; int ベース;
ケース1: if (zend_get_parameters_ex(1, &num) == 失敗) { WRONG_PARAM_COUNT; } base = 10; 休憩; ケース2: if (zend_get_parameters_ex(2, &num, &arg_base) == 失敗) { WRONG_PARAM_COUNT; } convert_to_long_ex(arg_base); base = Z_LVAL_PP(arg_base); 休憩; デフォルト: WRONG_PARAM_COUNT; } RETVAL_ZVAL(*数値, 1, 0); convert_to_long_base(return_value、base); } Zend/zend_operators.c->>convert_to_long_base() …… ケース IS_STRING: strval = Z_STRVAL_P(op); Z_LVAL_P(op) = strtol(strval, NULL, ベース); STR_FREE(strval); 休憩; |
intval 関数が文字列パラメータを受け取ると、convert_to_long_base() を呼び出して処理し、次に Z_LVAL_P(op) = strtol(strval, NULL, Base); を呼び出して strtol 関数を通じてパラメータを処理します。
関数のプロトタイプは次のとおりです:
long int strtol(const char *nptr,char **endptr,int Base);
この関数は、パラメーターの基数に従って、パラメーター nptr 文字列を長整数に変換します。パラメーターの基数の範囲は 2 から 36、または 0 です。パラメーターの基数は、使用される基数の値が 10 の場合、10 進数になります。基本値が 16 の場合は 16 進数が使用されます。
プロセスは次のとおりです:
strtol() はパラメータ nptr 文字列をスキャンし、数値または正または負の符号に遭遇するまで変換を開始しません。数値以外の文字列または文字列の末尾 () に遭遇した場合も同様です。変換を終了し、結果を返します。
その後、if などの判定に intval を使用すると、判定が無意味になり、セキュリティ上の脆弱性が生じます。
3. テストコード
コードは次のとおりです | コードをコピー |
$o = 0.1; 出力結果: intval(0.2) = 0 false |
php intvalとintの違い
コードは次のとおりです | コードをコピー |
$t ='165'; echo gettype((int)($t)); '; echo gettype(intval($t)); //出力結果: integer 整数値: 165
echo gettype((int)($t)); '; echo gettype(intval($t)); //結果の整数整数値:0,0 $string="2a";
$string1=intval($string);
echo '$string1:'の値.$string1.'$string2:'の値:';//一重引用符は変数を出力せず、そのまま出力されます |