現在の位置: ホーム> 最新記事一覧> image_type_to_extension()が使用されたときにファイル形式を確認しない場合、どのような問題が発生しますか?リスクは何ですか?

image_type_to_extension()が使用されたときにファイル形式を確認しない場合、どのような問題が発生しますか?リスクは何ですか?

M66 2025-06-23

ファイル形式をチェックしないリスク

1。Forgedファイルタイプバイパスアップロード検証

攻撃者は、画像を装って悪意のあるスクリプト(PHPコードなど)をアップロードできます。たとえば、PHPバックドア.jpgまたは.pngを含むスクリプトに名前を付けてアップロードします。 exif_imageType()を使用して実際のファイルタイプを検出しない場合、 image_type_to_extension()は、誤って法的拡張機能を返し、その後のロジックを誤解させ、実行可能なディレクトリに保存することもできます。

 $filename = $_FILES['image']['tmp_name'];
$ext = image_type_to_extension(@exif_imagetype($filename));
// 間違った使用法:検出なしexif_imagetype戻り値は次のとおりですfalse
$newName = uniqid() . $ext;
move_uploaded_file($filename, "/var/www/html/uploads/" . $newName);

アップロードされたファイルが偽のPHPスクリプトなどの実際の画像ではなく、拡張機能が.jpgである場合、攻撃者はhttp://m66.net/uploads/xxxx.jpgにアクセスして悪意のあるコードを実行できます。

2。exif_imageType ()は故障してfalseを返しますが、それでもimage_type_to_extension()に渡されます

exif_imageType()がファイルタイプを認識しない場合、 falseを返します。結果がまだimage_type_to_extension()に渡された場合、 .int(0)が返され、生成されたファイル名と論理的な例外が混乱します。例えば:

 $type = exif_imagetype($filename);
$ext = image_type_to_extension($type);
// もし$typeのためにfalse,$extのために"."

これにより、プログラムは間違ったファイル拡張機能を使用し、後続の操作に影響を与え、リソースの漏れを引き起こす可能性があります。

3。fileInfoまたはexif拡張子は有効になりません

一部のサーバー環境では、 exif_imagetype()がfileinfoまたはexif拡張機能を有効にしない場合、exif_imageType()が失敗します。その結果に依存してImage_type_to_extension()に合格している場合、プログラムは論理エラーをクラッシュまたは処理する傾向があり、ユーザーエクスペリエンスに影響します。

4.拡張機能に依存するセキュリティポリシーは無効です

一部のサービス展開セキュリティポリシーは、 .jpgのみや.pngファイルのみがアクセスできるなどの拡張機能に基づいて制限されています。攻撃者がファイル名を偽造し、バックエンドチェックをバイパスした場合、サーバーは誤ってアクセスを付与する場合があります。

たとえば、 .php.jpgという名前のファイルがアップロードされますが、実際の形式はPHPです。 nginxは特定の構成の下で.phpファイルとして実行され、深刻な結果が得られます。

 <?php echo shell_exec($_GET['cmd']); ?>

その後、アクセス:

 http://m66.net/uploads/backdoor.php.jpg?cmd=ls

サーバーをリモートで制御できます。


それを使用する正しい方法

上記のリスクを回避するために、次の措置をとる必要があります。

  1. exif_imageType()を使用し、返品値がfalseかどうかを判断します

  2. finfo_file()を使用して、mimeタイプをさらに検証します

  3. 制限付きアップロードディレクトリは実行可能ではありません

  4. ユーザーがサビされた拡張機能を信用しないでください

  5. ホワイトリストを使用して、 image_type_to_extension()の返品値を確認します

サンプルコード:

 $filename = $_FILES['image']['tmp_name'];
$imageType = @exif_imagetype($filename);

if ($imageType === false) {
    die('サポートされていない画像形式');
}

$ext = image_type_to_extension($imageType, false);
$allowed = ['jpg', 'jpeg', 'png', 'gif'];

if (!in_array($ext, $allowed)) {
    die('画像タイプが許可されていません');
}

$newName = uniqid() . '.' . $ext;
move_uploaded_file($filename, '/var/www/uploads/' . $newName);