ホームページ >バックエンド開発 >PHPチュートリアル >PHP はアップロードされている Excel ファイルのタイプを検出します

PHP はアップロードされている Excel ファイルのタイプを検出します

WBOY
WBOYオリジナル
2016-06-13 13:00:061026ブラウズ

PHP はアップロードされた Excel ファイルの種類を検出します

前書き

サフィックス名の変更などのローエンドの検出エラーを防ぐことができる、アップロードされたファイル タイプを検出するための比較的ハイエンドなメソッドを紹介します。これを呼び出し用のクラスにカプセル化します。


MIME タイプ

出力結果をブラウザに送信する場合、ブラウザは出力ドキュメントを処理するために適切なアプリケーションを起動する必要があります。これは、さまざまなタイプの MIME (多目的インターネット メール拡張機能) を通じて実現できます。 http では、MIME タイプは content-type ヘッダーで定義されます。

たとえば、クライアントが Excel ファイルをサーバーにアップロードする場合、MIME タイプは "application/vnd.ms-excel" になります。 php では、アップロードされたファイルの種類は $_FILE["type"] を通じて取得できます。

初期の HTTP プロトコルでは、追加のデータ型情報はなく、クライアントによってマルチメディア データ型をサポートするために、追加のデータ型が使用されました。データ型を識別するためのドキュメントの前にある HTTP プロトコルのデータ型情報。

各 MIME タイプは 2 つの部分で構成され、最初の部分はデータの一般的なカテゴリであり、2 番目の部分は特定のタイプを定義します。 (詳しくはMIMEタイプ表をご確認ください)


ファイル検出のデメリット

  • ファイル拡張子検出の脆弱性 (ps: ファイル拡張子は任意に偽造される可能性があります)
  • ファイルの MIME タイプ判定はできませんuse $_FILES['userfile']['type'](ps:公式 PHP ドキュメントによると、この値は完全に偽造可能です。ハッカーはブラウザのポスト リクエスト ヘッダーを変更するだけでこのセクションを回避できます。 コード インスペクション任意のタイプのファイルをアップロードします )

検出方法(Excelの場合)

  • ファイル拡張子を使用して、それが 03 の Excel ファイルであるか、07 の Excel ファイルであるかを判断します。
  • 異なるファイルに従って、異なるファイルのバイナリ データを取得し、file_signature と比較します。 03と07のExcelファイルのバイナリデータチャートを参照できます。ツールはexcel
  • madedit
    03です。
  • 07 Excel (07 は zip 検出を参照できます)


検出手順

	/**
	 * Detect upload file type
	 * 
	 * @param array $file        	
	 * @return bool $flag
	 */
	private function detectUploadFileMIME($file) {
		// 1.through the file extension judgement 03 or 07
		$flag = 0;
		$file_array = explode ( ".", $file ["name"] );
		$file_extension = strtolower ( array_pop ( $file_array ) );
		
		// 2.through the binary content to detect the file
		switch ($file_extension) {
			case "xls" :
				// 2003 excel
				$fh = fopen ( $file ["tmp_name"], "rb" );
				$bin = fread ( $fh, 8 );
				fclose ( $fh );
				$strinfo = @unpack ( "C8chars", $bin );
				$typecode = "";
				foreach ( $strinfo as $num ) {
					$typecode .= dechex ( $num );
				}
				if ($typecode == "d0cf11e0a1b11ae1") {
					$flag = 1;
				}
				break;
			case "xlsx" :
				// 2007 excel
				$fh = fopen ( $file ["tmp_name"], "rb" );
				$bin = fread ( $fh, 4 );
				fclose ( $fh );
				$strinfo = @unpack ( "C4chars", $bin );
				$typecode = "";
				foreach ( $strinfo as $num ) {
					$typecode .= dechex ( $num );
				}
				echo $typecode;
				if ($typecode == "504b34") {
					$flag = 1;
				}
				break;
		}
		
		// 3.return the flag
		return $flag;
	}

参考リンク

ファイルタイプ比較表


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