アップロードするファイルの種類を確認したいのですが、信頼できる方法を教えてください。その場合、ファイルの種類に関するより正確な情報を入手できますか? これで:
$_files['uploaded_file']['type']
またはこれで:
$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];
?
アップロードするファイルの種類を確認したいのですが、信頼できる方法を教えてください。その場合、ファイルの種類に関するより正確な情報を入手できますか? これで:
$_files['uploaded_file']['type']
またはこれで:
$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];
?
$_FILES['uploaded_file']['type']
ユーザー入力 - クライアントによって定義された任意の文字列です。したがって、何にでも使用するのは安全ではありません。
getimagesize()
より安全な方法ですが、完全に保護されるわけではありません。
次のことも必要です。
getimagesize()
ファイルに関連付けられたメタ データのみを参照し、ファイル データは参照しません。画像のように見えるものの中に悪意のあるコードを隠すことができます。画像を再サンプリングしたら、アップロードされたファイルがサーバーから削除されていることを確認してください。$_FILES[...]['type']
決して信頼できるものではなく、ユーザーが指定した任意の値です。getimagesize
、exif_imagetype
またはfinfoは、取得したものを確認するための推奨される方法です。アップロードによるセキュリティの脅威も参照してください。
私はgetimagesizeを信頼します
アップロードされたファイルの種類は誰でも編集できるため、Firefox の改ざんデータ アドオンのような HTTP/HTTPS ヘッダーを使用する
を使用すると、ファイルの環境定義 (GD モジュール mime データベース)を使用getimagesize()
するため、より一貫した mime 情報が提供されます。mime-type
のみに依存している場合は$_FILES['uploaded_file']['type']
、クライアント コンピュータ (ブラウザなど) で定義されている MIME タイプが含まれるか、ブラウザが MIME タイプを送信しない場合があります。
これの非常にばかげた例の 1 つは、checking です。これは、 MIME タイプif($_FILES['uploaded_file']['type'] == 'image/jpeg')
を送信する IE6/7 を使用すると失敗する可能性があります。'image/pjpeg'
これらの両方の代替手段は usingmime_content_type()
ですが、PECLモジュールとして非推奨になっているため、PHP 5.3.0の時点で、どのファイルタイプでもより一貫して動作するFileInfo関数があります-ただし、テストしていません.
MIME タイプの概要については、この SO 記事を確認してください: How do I find the mime-type of a file with php?
実際には、おそらく画像に付属するメタデータ ( $_files['uploaded_file']['type']
) を使用する必要がありますが、これはアップロード前に改ざんされる可能性があります。
サイズ重視の方は、 で実際に画像を測るよりも早いのでこちらを使ってgetimagesize
ください。ただし、ファイルタイプ情報が必要な場合は、ファイルが「言う」ことを超えてチェックすることをお勧めします。単純なチェックで実行可能ファイルを盗むのは簡単だからです。
決して信用しないでください$_FILES["image"]["type"]
。ブラウザから送信されたものは何でも取得するため、画像の種類としてこれを信頼しないでください。だから使用するgetimagesize()
か、より安全な側に置きたい場合は使用してくださいfinfo_open