2009-07-17 8 views
5

特定の画像がJPEGであるかどうかを確認する必要があります。画像がJPEGであることを確認してください

if ($_FILES["fname"]["error"] > 0) { 
    $imgData = "hyperlink/holder.jpg"; 
} else { 
    $imgData ="hyperlink/" . $_FILES["fname"]["name"]; 
} 
// Only accept jpg images 
// pjpeg is for Internet Explorer should be jpeg 
if (!($_FILES["fname"]["type"] == "image/pjpeg")) { 
    print "I only accept jpg files!"; 
    exit(0); 
} 

それは常に私が唯一のJPGファイルを受け入れる与え文の場合、それは最初の最初のステートメントに行きます!

どうすれば修正できますか?

答えて

3

PHPには、このような優れたイメージタイプのサポートがあります。私はなぜアプリケーションを制限しているのでしょうか?それが要件である場合は、任意の入力フォーマットに対処し、JPEGに変換することができ、コードだけのカップルラインでは、...

$im = imagecreatefrompng(input_filename) 
imagejpeg($im, output_filename); 
17

exif_imagetype画像機能を試してみてください。

例:$_FILESを使用している場合

if(exif_imagetype($filepath) != IMAGETYPE_JPEG){ 
    echo 'Not a JPEG image'; 
} 
0

、あなたは(あなたが私ならば、それは、常に同じではない、と見てきまし行うための最善のものではありませんクライアントによって送信された情報に依存しています正しく覚えて、$_FILES['...']['type']は偽造することができます)。

PHP> = 5.3を使用している(またはPECLパッケージをインストールできる)場合は、拡張子Fileinfoを見てください。古いバージョンを使用している場合、mime_content_typeはどうですか?

そして、スコット氏によると、なぜjpegしか許可しないのですか?

コードをよく調べる:最初のケース(error > 0)にいるときは、デフォルトファイルを$imgDataに割り当てていますか?なぜ "ハイパーリンク"の周りのスペース? そして、なぜ前に数行のエラーがあったとしても、いつもcontent-typeをチェックするのにどうしますか?

終了するには、マニュアル(Handling file uploads)を見ましたか?

0

例外の配列(ユーザーがアップロードできるようにするファイル)を作成してみてください。このコードを使用してファイルの

// Hyperlink for your website 
$hyperlink = "http://www.yourwebsitehere.com"; 

if($_FILES['fname']['error'] > 0) 
{ 
    $image= $hyperlink . "/holder.jpg"; 
} 
else 
{ 
    $image = $hyperlink . "/" . $_FILES['fname']['name']; 
} 

// Only accept files of jpeg format 
$exceptions = array("image/jpg", "image/jpeg", "image/pjpeg"); 

foreach($exceptions as $value) 
{ 
    if($_FILES['fname']['type'] != $value) 
    { 
     echo "I only accept jpeg images!"; 
     break; // Or exit(); 
    } 
} 
+0

$ _FILES ['fname'] ['type'] 'の割り当ては、常にifブロックをスキップします。 (すなわち、成功) –

1

Check the mime(多目的インターネットメール拡張)タイプ。必要なタイプを確認します。このコードでpng、gifを検出することもできます。

if($_FILES["fname"]["type"] == "image/jpeg") 
    { 
     echo "File type is JPEG"; 
    } 
+0

ハッカーは簡単にMIMEタイプを偽造することができます。 – hanshenrik

1

私は、次の作品を信じて:

はまた、次の点に注意してください

(exif_imagetype($ ImagePathAndName)== IMAGETYPE_JPEG)

だけ見て最初の数バイトを読み込み、イメージヘッダーの場合は、イメージが破損しているかどうかを確認するのに十分ではありません。

以下、論理的な "and"ステートメントこれらのテストの両方が有効と非壊れなどとしての資格をイメージために渡す必要があります。

if ((exif_imagetype($ImagePathAndName) == IMAGETYPE_JPEG) && (imagecreatefromjpeg($ImagePathAndName) !== false)) 
{ 
echo 'The picture is a valid jpg<br>'; 
} 

注:あなたがするために、PHPコードの先頭にこのコード行を配置する必要がありますimagecreatefromjpeg($ ImagePathAndName)から偽/壊れたイメージファイルに遭遇したときに警告メッセージが表示されないようにしてください。

ini_set(‘gd.jpeg_ignore_warning’, 1);