ホームページ  >  記事  >  バックエンド開発  >  php intval() 10 進数のセキュリティ脆弱性分析_PHP チュートリアル

php intval() 10 進数のセキュリティ脆弱性分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:10:271217ブラウズ

この記事ではまず、文字、数値、小数点を灰色の数値データに変換できる 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 ベース;


スイッチ (ZEND_NUM_ARGS()) {

ケース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;
for($a = 1; $a $o += 0.1;
echo "
intval($o) = ".intval($o);
if(intval($o)){
print(“ true”);
}その他{
print(“ false”);
}
}?>

出力結果:

intval(0.2) = 0 false
intval(0.3) = 0 false
intval(0.4) = 0 false
intval(0.5) = 0 false
intval(0.6) = 0 false
intval(0.7) = 0 false
intval(0.8) = 0 false
intval(0.9) = 0 false
intval(1) = 0 false
intval(1.1) = 1 true
intval(1.2) = 1 true
intval(1.3) = 1 true
intval(1.4) = 1 true
intval(1.5) = 1 true
intval(1.6) = 1 true
intval(1.7) = 1 true
intval(1.8) = 1 true
intval(1.9) = 1 true
intval(2) = 2 true
…..

php intvalとintの違い

コードは次のとおりです コードをコピー

$t ='165';

echo gettype((int)($t));
echo '


';
echo gettype(intval($t));

//出力結果: integer 整数値: 165


$t ='a165';

echo gettype((int)($t));
echo '


';
echo gettype(intval($t));

//結果の整数整数値:0,0

$string="2a"; $string1=intval($string); echo '$string1:'の値.$string1.'$string2:'の値:';//一重引用符は変数を出力せず、そのまま出力されます
$string2=(int)($string); $string2 をエコーし​​ます


http://www.bkjia.com/PHPjc/629657.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629657.html技術記事この記事ではまず、文字、数値、小数をグレーのデジタルデータに変換できる php intval の簡単な使い方を紹介します。ただし、10 進数の 1.1 が 1 に変換されるなど、変換中にいくつかの問題が発生します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。