ホームページ  >  記事  >  バックエンド開発  >  PHP の弱い型の安全性の問題の概要

PHP の弱い型の安全性の問題の概要

巴扎黑
巴扎黑オリジナル
2016-11-08 10:38:36850ブラウズ

少し前に、南京郵電大学のネットワーク攻撃と防御プラットフォームについて質問しました。記事を書いた後、まだそれを要約する必要があります。問題はすべて Web 形式であり、すべて PHP を使用して作成されているため、SQL インジェクションや XSS などの従来の脆弱性を調査していない問題が多く、その多くは PHP 自体の構文に問題があります。 PHP が現在世界で最高の言語であることを考えると、PHP 自体の問題も Web セキュリティの側面として考慮される可能性があります。 PHP トレーニングの特徴は、弱い型付けと、組み込み関数による受信パラメーターの緩やかな処理です。この記事は主に、攻守のプラットフォームを構築する際に遭遇したPHP関数の問題点や、PHPの弱い型によって引き起こされる問題点を記録するものです。
PHPの弱い型の紹介
PHPでは以下の操作を実行できます。
$param = 1;
$param = "stringg";
弱い型指定言語では、変数を他の型にいつでも割り当てることができます。他のタイプのデータに変換することもできます。
型変換の問題
型変換は避けられない問題です。たとえば、GET または POST パラメータを int 型に変換する必要がある場合、または 2 つの変数が一致しない場合、PHP は変数を自動的に変換します。ただし、PHP は型指定が弱い言語であるため、型変換を実行するときに多くの予期せぬ問題が発生します。
比較演算子
型変換
$a==$b の比較の場合
$a=null;$b=flase; //true
$a='';$b=null; //こんな感じなど多くの例がありますが、この種の比較はすべて同等です。
比較演算子を使用する場合、次のような型変換の問題もあります:
0=='0' //true
0 == 'abcdefg' //true
0 === 'abcdefg' //false
1 = = '1abcdef' //true
異なる型の変数を比較すると、変数変換の問題が発生したり、変換後に問題が発生したりする可能性があります。
ハッシュ比較
上記の方法に加えて、ハッシュ比較を実行する際にも問題があります。次のように:
"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1ddd​​ada" //false
"0e1abc"=="0" //true
比較演算を実行するときに、0ed+ が発生した場合この文字列は科学表記法に解析されます。したがって、上の例の 2 つの数値の値は両方とも 0 であり、等しいです。 0ed+ が満たされない場合、このパターンは等しくなりません。この質問は、攻撃的および防御的なプラットフォームの md5 衝突でテストされます。
16 進数変換
16 進数の剰余文字列を比較する場合にも問題があります。例は次のとおりです。
"0x1e240"=="123456" //true
"0x1e240"==123456 //true
"0x1e240"=="1e240" //false
いずれかの文字列が 0x で始まる場合、PHP はこの文字列を 10 進数に解析して比較します。0×1240 を 10 進数に解析すると 123456 となるため、int 型と string 型の 123456 との比較は等しくなります。攻守のプラットフォームで名前を付けるのが難しいのは、捜査の特性によるものです。
型変換
一般的な変換は、主に int から string への変換、および string から int への変換です。
int から文字列へ:
$var = 5;
方法 1: $item = (string)$var;
文字列から int: intval() 関数。
この関数については、まず 2 つの例を見てください。
var_dump(intval('2')) //2
var_dump(intval('3abcd')) //3
var_dump(intval('abcd')) //0
intval() が変換されると、 will 変換は、文字列の先頭から数字以外の文字が出現するまで実行されます。変換できない文字列があっても intval() はエラーにはならずに 0 を返します。
intval() のこの機能は、攻撃的および防御的なプラットフォームの MYSQL の問題でテストされます。
同時に、プログラマはプログラミング時に次のコードを使用しないでください:
if(intval($a)>1000) {
mysql_query("select * from news where id=".$a)
}
現時点では, $a の値は 1002 Union になる可能性があります...
組み込み関数のパラメータの緩さ
組み込み関数の緩さとは、関数を呼び出すときに、関数が受け入れることができないパラメータの型が関数に渡されることを意味します。説明は少しわかりにくいので、以下ではそのような関数のいくつかに焦点を当てて、実際の例を通して問題を説明します。
md5()
$array1[] = array(
"foo" => "bar",
"bar" => "foo",
);
$array2 = array("foo", "bar", " hello", "world");
var_dump(md5($array1)==var_dump($array2)); //true
PHP マニュアルの md5() 関数の説明は string md5 ( string $str [, bool $raw_output = false ] ) であり、md5() の必須パラメータは文字列型パラメータです。しかし、配列を渡すと、md5() はエラーを報告せず、配列の md5 値を正しく計算できなくなります。これにより、2 つの配列の md5 値が等しくなります。 md5() のこの機能は、攻撃および防御プラットフォームでのバイパスでも考慮されています。
strcmp()
strcmp() 関数は、PHP 公式マニュアルでは int strcmp ( string $str1 , string $str2 ) として説明されており、2 つの文字列型パラメータを strcmp() に渡す必要があります。 str1 が str2 より小さい場合は -1 が返され、等しい場合は 0 が返され、そうでない場合は 1 が返されます。文字列を比較する strcmp 関数の本質は、2 つの変数を ASCII に変換し、減算演算を実行し、演算結果に基づいて戻り値を決定することです。
strcmp() に渡されるパラメータが数値の場合はどうなりますか?
$array=[1,2,3];
var_dump(strcmp($array,'123')); //null は、ある意味では false と同等です。
strcmp のこの機能は、攻撃および防御プラットフォームのパスチェックでテストされています。
switch()
switchが数値型の大文字小文字判定の場合、switchはパラメータをint型に変換します。以下のように:
$i ="2abc";
switch ($i) {
case 0:
case 1:
case 2:
echo "i は 3 未満ですが、負ではありません";
case 3:
echo "i is 3";
}
このとき、プログラムの出力は i が 3 未満ですが、負ではありません。これは、switch() 関数が $i に対して型変換を実行し、変換結果が 2 であるためです。
in_array()
PHP マニュアルでは、in_array() 関数の説明は bool in_array (mixed $needle , array $haystack [, bool $strict = FALSE ] ) です。 strict パラメーターが指定されていない場合、 in_array は次のようになります。 $needle が $haystack にあるかどうかを判断するには、緩い比較を使用します。 stringe の値が true の場合、in_array() は needls の型と haystack の型を比較して、それらが同じかどうかを確認します。
$array=[0,1,2,'3'];
var_dump(in_array('abc', $array)) //true
var_dump('1bc', $array);
「abc」は 0 に変換され、「1bc」は 1 に変換されるため、上記の状況は true を返すことがわかります。
array_search() と in_array() には同じ問題があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。