2012-04-24 17 views
2

ここで新しい人は、簡単な解決策で何が達成されるべきか質問します。ファイルアップロードサーバー側を検証する - PHPで画像のみを許可する

私はたくさんのコードを試しました。私はgetimagesizeのファイルストリームを取得し、クラッシュすることなく他のものを動作させることができるようです。

私は、アップロードされたファイルを制限して画像ファイルだけで悪くないようにする必要がある古いプロジェクトを取り除いています。

このコードはいつもここで私に何

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']); 
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { 
alert ("Sorry, we only accept GIF and JPEG images"); 
exit; 
} 

かかわらず、エラーメッセージを与えるブラックリストの努力である

$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py" 
,".txt", ".doc"); 

foreach ($blacklist as $file) 
{ 
if(preg_match("/$file\$/i", $_FILES['bf_file'][$key]['tmp_name'])) 
{ 
alert "ERROR: Uploading executable files Not Allowed\n"; 
exit(); 
} 
} 

ここで別のgetimagesizeは、これらのそれぞれに

$size = getimagesize($_FILES[bf_file][$key][tmp_name]); 
$fp = fopen($_FILES[bf_file][$key][tmp_name], "rb"); 
if ($size && $fp) { 
header("Content-type: {$size['mime']}"); 
fpassthru($fp); 
continue; 
} else 
// error 
alert("Inappropriate file type"); 

ですファイルがアップロードされているかどうかにかかわらずエラーメッセージが表示されます。

これらのコントロールをファイルのどこかに配置するだけで、アップロードされたファイルがチェックに合格すると、すべてがアップローダとして渡され、他のすべての機能はこれらのリミッタとチェックの恩恵を受けることなく行われます。

また、ファイルをアップロードする必要はありません。件名、本文、ファイルアップロードの3つのフィールドがあります。件名と本文のみがデータを持つ必要があり、現在は機能しています。

ご協力いただきますようお願い申し上げます。

おかげで、

ジェームズ

+3

'$ key'の値は何ですか?何が含まれていても、ずっと前からPHPの作者の中には*プレミアム*の愚かさのため、あなたは '$ _FILES ['bf_file'] ['tmp_name'] [$ key]'を参照する必要があります'$ _FILES ['bf_file'] [$ key] ['tmp_name']'のいずれかです。また、 'getimagesize()'がこれを行う唯一の賢明な方法であることに注意してください。コメントが私に与える少量の空間で、あなたのブラックリストアプローチに間違っていることを説明することさえできません。 – DaveRandom

+1

これは1つです:あなたのpreg_matchは複数行ではないので、空白の攻撃に対して脆弱です。ブラックリストではなく、ホワイトリストを使用する理由の1つ。また、イメージキャンバスからピクセルデータをコピーする必要があります。ファイルをそのまま保存すると、悪意のあるユーザーが埋め込みサーバーサイドスクリプトを含むイメージファイルをアップロードする可能性があります。 – Cheekysoft

+0

@Cheekysoft、 'index.php5'(存在するかもしれない)、' index.php.fr'([content negotiation](http://httpd.apache.org/docs/current/content-negotiation.html) ) – xfix

答えて

1

スクリプトが一時名は$_FILES['bf_file']['tmp_name'][$key]こともサイズを提出すべき取得するには、すべての場所の例

$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']); 

上ですでに$_FILES['bf_file']['size'][$key]

を介して返されます類似の質問の詳細例をご覧ください。

最初のスニペットで

multi image upload wrong quantity on file-upload

Uploading images with the help of arrays and fetch errors

+0

私は単に周りを見回し、ウェブからこれらのコードをつかんで、私のページに投げ込んだことは明らかです。 $キーの位置について言えば、これは複数の画像がアップロードされる可能性があるために表示されます。ありがとうございます – crazytrain999

+0

あなたは歓迎です..詳細をご覧になる前にリンクをクリックしてください...そしてその非常に文字列のフロアード..あなたはそれをカスタマイズするべきではありません – Baba

1

。まあ、getimagesize()は実際にはMIMEタイプを返しますが、あなたはそれに頼るべきではありません。 PNG GIF(PNGをブロックする理由は何ですか?)の後、ヘッダーの後に<?php dangerous_code(); ?>があるファイルを作成することは完全に可能です。また、私はあなたが何を試しているのかわからない[$key]。私はそれが何であるか分かりませんし、配列は$_FILES[$form_name][$file_field]のように見えます(例えば$_FILES['file_input']['tmp_size'])3番目のフィールドはありません複数のファイルのアップロードをしていない限り、Babaが言ったことを調べてください(非常にハッキーな機能です) alert() - おそらくechoを意味します。

2番目のスニペットでは、間違ったことをしています。ドットは正規表現のメタ文字ですが、この場合はそれほど重要ではありません。あなたのサーバが例えば.php5拡張をサポートしていないかどうかわからないので、ブラックリストの方法には何らかの欠陥があります。そして、たとえそうでなくても、誰かがcontent negotiationをApacheで悪用できます。hack.php.fr(Apacheは.frが言語だと思っています)。あなたのアプローチには欠陥があります。オリジナルの拡張機能が何であっても、PNGファイル.pngを付与するだけです。

3番目の例では間違った変数を有効にしますが、barewordsも使用します(大文字の定数が必要であることを認識していますが、PHPとは異なり、常識的な意味があります)、極端に遅く、通常の文字列よりも遅く、E_NOTICE(ヒント:あなたがすべきです)がある場合は、多くのエラーが発生します。次に、continueif用ではありません。ループ条件用です(switchbreak)でも動作しますが、一貫性のためです)。

ファイルをアップロードする必要がないため、簡単です。ただ条件付きでisset($_FILES['file_input_name'])以上にしてください。

TL; DRは - 最も安全なアプローチは、ユーザが完全にアップロードすることができますフォルダ内の動的なものを実行してから、あなたのウェブサーバを防ぐためです抜いて適切に

+0

'PHPとは逆に、barewordsはあまり危険ではありませんもしあなたが常識を持っていれば - 公正な点だが、彼らはまだ簡単に回避できるエラーであなたのエラーログを混乱させる。 – DaveRandom

+0

@DaveRandom:更新された – xfix

+0

+1 – Baba

0

をPHPをご覧ください。それでは、アップロードするものは問題ではありません。

アップロードディレクトリのphp_flag engine offを含む.htaccessファイルは、PHPを防止します。とにかく、他の実行可能ファイルはデフォルトで無効にする必要がありますが、確かにチェックする必要があります。

関連する問題