アップロードされたファイルの種類を確認するにはどうすればよいですか?

WBOY
リリース: 2016-06-13 13:45:26
オリジナル
1045 人が閲覧しました

アップロードされたファイルの種類の確認
サフィックス名を確認することは得策ではありません。他の人がこれを使用してトロイの木馬のサフィックス名を .jpg に変更しているのを見たことがあります。次に、侵入の例

では、アップロードされたファイルの正しい種類を確認するより安全な方法はあるのでしょうか?

-----解決策---------


をコピーして貼り付ける最悪の方法は、$_FILES[...]['type'] を介してアップロードされたファイルのタイプを確認することです。ファイル拡張子を変更するだけで偽装できるためです。

もう 1 つの比較的安全な方法は、ファイルの最初の 2 バイトの内容に基づいてアップロードされたファイルのタイプを判断することです。コード例は次のとおりです。

$handle = fopen($ _FILES[.. .]['tmp_name'], 'rb');
$content = fread($handle, 2);

$info = unpack ('c2chars' , $content);

if (emptyempty($info['chars1']) || emptyempty($info['chars2'])) {
exit('エラー!' );
}

if ($info['chars1'] < 0) {
$info['chars1'] += 256;
if ($ info['chars2 '] < 0) {
$info['chars2'] += 256;

$code = $info['chars1'] . chars2'];


PHP の Pack&unpack 関数は非常に優れています。興味がある場合は、pack() と unpack() を使用した PHP でのバイナリ データの処理

を参照してください。注: インターネット上のほとんどの関連検索では、プログラムは 256 関連の操作を実行しません。これは、私自身のテスト データの解釈に基づく TDD の結果です。それが正しいかどうかは、読者が独自に判断する必要があります。 。

スイッチを使用して、ファイル タイプに対応する $code 変数を決定します。一般的な画像タイプの結果は次のようになります:

GIF: 7173
JPG: 255216
PNG: 13780

もちろん、他のファイルタイプも自分で実験して判断することができます。ただし、最初の 2 バイトの内容も偽造される可能性があるため、この方法は必ずしも安全であるとは限りません。そのため、誤って解析されないようにファイル拡張子を制限することをお勧めします。たとえば、foobar ファイルという名前のファイルを作成します。内容は次のとおりです:

GIF89




最初の 2 つの単語セクションを使用する場合ファイル タイプを検出すると、結果は GIF: 7173 になります。シェルで file コマンドを使用して検出した場合でも、GIF 画像と誤認されます:

# file foobar.php
foobar.php: GIF 画像データ 16188 x 26736

拡張子が .php であるため、このファイルは php エンジンによって解析され、ハッカーに Web シェルが与えられ、セキュリティが不可能になります。したがって、ファイル拡張子を制限することが非常に重要です。覚えておいてください。この種の偽装を検出する方法としては、次のシェル コマンドを使用してフィルタリングするのが最も簡単です。

# strings foobar.php | grep -i "

このような危険を完全に防ぎたい場合は、gd、imagemagick、graphicsmagick などのツールを使用して、アップロードされた画像に必要な編集を行うことを検討できます。ユーザーを削除してから、埋め込みコードを削除できるようにします。より安全にしたい場合は、画像サーバーも分離し、PHP をインストールせず、静的ファイルのみを解析する必要があります。

補足: 画像だけを判断する場合は、getimagesize というより簡単なメソッドがありますが、このメソッドは名前から画像のサイズを取得するために使用されますが、結果には画像の種類も含まれます。この方法はドキュメントの GD セクションにまとめられており、GD がインストールされていない場合でも使用できます。ただし、以前と同様、セキュリティの問題にも注意する必要があります。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート