ホームページ バックエンド開発 PHPチュートリアル PHP の弱い型の安全性の問題の概要

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

Nov 08, 2016 am 10:38 AM

少し前に、南京郵電大学のネットワーク攻撃と防御プラットフォームについて質問しました。記事を書いた後、まだそれを要約する必要があります。問題はすべて 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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

11ベストPHP URLショートナースクリプト(無料およびプレミアム) 11ベストPHP URLショートナースクリプト(無料およびプレミアム) Mar 03, 2025 am 10:49 AM

11ベストPHP URLショートナースクリプト(無料およびプレミアム)

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelでフラッシュセッションデータを使用します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelテストでの簡略化されたHTTP応答のモッキング

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

LaravelのバックエンドでReactアプリを構築する:パート2、React

Instagram APIの紹介 Instagram APIの紹介 Mar 02, 2025 am 09:32 AM

Instagram APIの紹介

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPのカール:REST APIでPHPカール拡張機能を使用する方法

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

Codecanyonで12の最高のPHPチャットスクリプト

Laravelの通知 Laravelの通知 Mar 04, 2025 am 09:22 AM

Laravelの通知

See all articles