PHPでは、 FINFOは、ファイルのMIMEタイプ、エンコーディングなどのメタ情報を取得するための非常に実用的な拡張機能です。従来のMIME_CONTENT_TYPE()関数と比較して、 FINFOはより正確で柔軟な機能を提供します。 FINFOを正しく使用すると、ファイルタイプの変装を防止し、ファイル処理セキュリティを改善できます。この記事では、 FINFOと一般的な予防策を使用するためのいくつかの正しい方法を詳細に紹介します。
最も一般的な用途は、アップロードされたファイルが画像またはPDFであるかどうかを判断するなど、ファイルのMIMEタイプを取得することです。
<?php
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file('/path/to/file.pdf');
echo $mimeType;
上記のコードでは、 FileInfo_mime_typeはFINFOに、アプリケーション/PDFやImage/JPEGなどのMIMEタイプを返すことを指示します。これは、ファイルタイプを判断する標準的な方法です。
ファイルのコンテンツが必ずしもディスク上に保存されるわけではなく、APIによるアップロードなどの変数を介して渡される場合があります。 FINFO_BUFFERメソッドを使用できます。
<?php
$finfo = new finfo(FILEINFO_MIME_TYPE);
$data = file_get_contents('https://gitbox.net/sample.png');
$mimeType = $finfo->buffer($data);
echo $mimeType;
この方法は、ストリーミングデータまたはリモートクロールコンテンツの処理に適しています。
ファイルアップロードにおけるFINFOの典型的なアプリケーションは、ファイルコンテンツが拡張機能と一致するかどうかを確認することで、ユーザーが悪意のあるスクリプトファイルを写真としてアップロードすることを妨げます。
<?php
if ($_FILES['upload']['error'] === UPLOAD_ERR_OK) {
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['upload']['tmp_name']);
$allowedTypes = [
'image/jpeg' => 'jpg',
'image/png' => 'png',
'application/pdf' => 'pdf',
];
if (!array_key_exists($mimeType, $allowedTypes)) {
die('サポートされていないファイルタイプ。');
}
$ext = $allowedTypes[$mimeType];
move_uploaded_file($_FILES['upload']['tmp_name'], "/uploads/file.$ext");
}
FINFOとプリセットホワイトリストによって検出されたMIMEタイプを比較することにより、違法なファイルのアップロードを効果的に防ぐことができます。
ファイル拡張機能は簡単に改ざんされており、拡張機能に依存することによってのみファイルタイプを判断することは安全ではありません。実際のコンテンツは、 FINFOを使用して常にチェックする必要があります。
PHP環境の古いバージョンの一部には、 FileInfo拡張機能が有効になっていない場合があります。 phpinfo()またはendix_loaded( 'fileinfo')で確認できます。
<?php
if (!extension_loaded('fileinfo')) {
die('fileinfo 拡張機能が有効になっていません');
}
finfo-> file()では、ファイルが存在し、許可を読み取る必要があります。そうしないと、アプリケーション/オクテットストリームまたはfalseを返す場合があります。
fileInfo_mime_typeに加えて、 fileinfo_mimeを使用して、エンコード形式などのより詳細な情報を取得することもできます。
<?php
$finfo = new finfo(FILEINFO_MIME);
$info = $finfo->file('/path/to/file.txt');
echo $info; // 例えば text/plain; charset=us-ascii
このアプローチは、多言語ドキュメントを扱うときやコンバージョンのエンコードを扱う場合に特に役立ちます。
FINFOを使用することは、PHPでファイルタイプを識別するための最も安全で信頼できる方法の1つです。ファイル検証、リモートデータ分析、またはシステム自動化タスクのアップロード、Mastering、およびFINFOを正しく使用するかどうかにかかわらず、アプリケーションにより高い安定性とセキュリティをもたらすことができます。 FileINFO拡張機能を有効にし、MIMEホワイトリストの判断と組み合わせて、より堅牢なファイル処理プロセスを構築してください。