PHP_FUNCTION(intval)
PHP_FUNCTION(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;
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);
}
Zend/zend_operators.c->>convert_to_long_base()
……
case IS_STRING:
strval = Z_STRVAL_P(op);
Z_LVAL_P(op) = strtol(strval, NULL, base);
STR_FREE(strval);
break;
|
{
zval **num, **arg_base;
int ベース;
スイッチ (ZEND_NUM_ARGS()) {
long int strtol(const char *nptr,char **endptr,int base); |
ケース 1:
if (zend_get_parameters_ex(1, &num) == FAILURE) {
WRONG_PARAM_COUNT;
}
ベース = 10;
休憩;
ケース 2:
if (zend_get_parameters_ex(2, &num, &arg_base) == FAILURE) {
WRONG_PARAM_COUNT;
//intval.php
$var="20070601";
if (intval($var))
echo "it's safe";
echo '$var='.$var;
echo "
";
$var1="1 union select 1,1,1 from admin";
if (intval($var1))
echo "it's safe too";
echo '$var1='.$var1;
|
}
convert_to_long_ex(arg_base);
ベース = Z_LVAL_PP(arg_base);
WordPress <= 2.0.6 wp-trackback.php Zend_Hash_Del_Key_Or_Index / sql injection exploit |
休憩;
デフォルト:
WRONG_PARAM_COUNT;
}
RETVAL_ZVAL(*num, 1, 0);
convert_to_long_base(return_value,base);
}
Zend/zend_operators.c->gt;>convert_to_long_base()
……
ケース IS_STRING:
strval = Z_STRVAL_P(op);
Z_LVAL_P(op) = strtol(strval, NULL, Base);
STR_FREE(strval);
休憩;
|
テーブル>
intval 関数は文字列パラメータを受け取ると、convert_to_long_base() を呼び出して処理し、次に Z_LVAL_P(op) = strtol(strval, NULL, Base); を呼び出して strtol 関数を通じてパラメータを処理します。
関数のプロトタイプは次のとおりです:
この関数は、パラメーターのbaseに従って、パラメーターのnptr文字列を長整数に変換します。パラメーターのbaseの範囲は2から36、または0です。パラメーターのbaseは、baseの値が10の場合、使用されるbaseメソッドを表します。 10 が使用され、基本値が 16 の場合は 16 進数が使用されます。
プロセスは次のとおりです:
strtol() はパラメータ nptr 文字列をスキャンし、先行するスペース文字をスキップします。数値または正負の記号が検出され、その後数値以外の文字列または文字列の末尾が検出されるまで変換は開始されません。
その後、if などの判定に intval を使用すると、判定が無意味になり、セキュリティ上の脆弱性が生じます。
3. テストコード