2012-01-07 7 views
0

アップロード時にPNG画像のみを受け付けるアップロードスクリプトを作成しようとしています。アップロードスクリプトはうまくいきますが、png画像の検出を追加すると、それが壊れます。ここでPHPアップロードファイルのフィルタリング

は、私はそれを設定している方法です。

if ($_FILES) { 

     if ($_FILES["file"]["type"] == "image/png") { 

     $target_path = "uploads/"; 
     $target_path = $target_path . basename($_FILES['uploadedfile']['name']); 

     if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
      echo "The file ". basename($_FILES['uploadedfile']['name']). 
      " has been uploaded"; 
     } else{ 
      echo "There was an error uploading the file, please try again!"; 
     } 

     } else { echo "Not A PNG…"; 

     } 

    } 

私はPNG画像をアップロードすると、私は「はPNG」エラーを取得する - 任意のアイデア?あなたはIF文で間違ったファイルの参照しているように見えます

+0

あなたはそれがPNGの画像だけでなく、.pngの拡張子を持つ他の形式だと確信していますか? – BartekR

+0

うん、私はチェックした。 – Thomas

+0

私はこの質問が正しくタイプミスのために機能していないことに気付いていましたが、そこで提供されているタイプ文字列が信頼できないことを他の人が指摘していたので対処する価値があります。これは絶対に当てはまります。ファイルに関するその他の情報を本質的にチェックしていないため、このチェックは、任意のコード(または他のもの)をシステムにアップロードできるように簡単に回避できます。このアップロードスクリプトを安全にするために他の手段を講じることをお勧めします。または近い将来にセキュリティ上の問題が発生する可能性があります。 –

答えて

3

if ($_FILES["file"]["type"] == "image/png") { 

if ($_FILES["uploadedfile"]["type"] == "image/png") { 

である必要があります( "ファイル" は "uploadedfileを" であることが必要)

+0

ありがとう、私は完全にそれを逃した - タイマーがアップしたら私はそれをチェックします。 – Thomas

+2

このスクリプトでは、画像が実際には* png画像であるとは限りません。 Mimetypeは簡単に偽装することができます。 –

+0

Srsly、それは問題でしたか? lol-btwもしあなたがPHP-GDを使って適切なPNGバリデーションをしたいのであれば、下の私の投稿を見てください、素敵な目@Ben D – Prof83

2

私はいくつかのサーバが$ _FILES変数にMIMEタイプの画像/ pngを追加していないのを見ました...少しCPUが重い方法です:

if (@imagecreatefrompng($_FILES["file"]["tmp_name"]) 

パフォーマンスやGDライブラリの欠如は単に拡張子を確認し、問題がある場合は、イメージキャンバス

を開くためにGDライブラリを使用しているとして、ここでは、パフォーマンスがわずかに低下します。

if (strtolower(end(explode('.',$_FILES["file"]["name"])) == 'png') 

あなたがimagecreatefrompng機能を使用したい場合は、確かにGDがインストールされていることを確認することをお勧めだろう:if (function_exists('imagecreatefrompng'))


重要 あなたは(あなたがする必要があります)メモリ使用量については慎重であれば、この

if ($image = @imagecreatefrompng($_FILES["file"]["tmp_name"]) { 
    // Do something 
    imagedestroy($image); 
    } 
2
  1. は何のために$_FILES[...]['type']は絶対に使用しないでくださいください。これは、実際のファイルとは関係ないかもしれない、任意のユーザー指定の文字列です。
  2. したがって、MIMEの種類を自分で確認してください。
  3. error_reporting(E_ALL); ini_set('display_errors', true);を有効にすると、特定のタイプミスを見つけるのに役立ちます。
  4. に不具合がありました。が失敗しました。

2と4の例:

if (!empty($_FILES['uploadedfile'])) { 
    if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) { 
     die('Error during upload'); 
    } 
    if (exif_imagetype($_FILES['uploadedfile']['tmp_name']) !== IMAGETYPE_PNG) { 
     die('Wrong file type'); 
    } 
    ... 
} 
関連する問題