2

ここで新しい男が、単純な解決策で何が満たされるべきかという質問をしています。

私はたくさんのコードを試しました。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 つのフィールドがあります。件名と本文のみがデータを持つ必要があり、それは現在機能しています。

どんな助けでも大歓迎です。

ありがとう、

ジェームズ

4

3 に答える 3

1

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

2 番目のスニペットでは、あなたのやり方が間違っていることがわかります。ドットは正規表現ではメタ文字ですが、この場合はあまり関係ありません。.php5たとえば、サーバーが拡張機能をサポートしていないかどうかがわからないため、ブラックリストのアプローチにはとにかく欠陥があります。そうでない場合でも、誰かがファイルを作成することで Apache のコンテンツ ネゴシエーションhack.php.frを悪用する可能性があります(Apache はそれ.frを言語と見なしています)。あなたのアプローチには欠陥があります-.png元の拡張子が何であれ、PNGファイル拡張子を付けてください。

3 番目の例では、間違った変数をアクティブにしていますが、ベアワードも使用しています (そうすべきではありませんが、定数は大文字にする必要があることは承知しています (したがって、PHP の言うこととは逆に、常識があればベアワードはそれほど危険ではありません)。 、それらは非常に遅く、通常の文字列よりもはるかに遅く、持っていると多くのエラーが発生しますE_NOTICE(ヒント: する必要があります))。次に、条件付きでcontinueはありませんif-ループ条件用ですswitch((as break)でも機能しますが、一貫性のためだけだと思います)。

ファイルをアップロードする必要がないのは簡単です。条件付きオーバーを行うだけですisset($_FILES['file_input_name'])

tl;dr - PHP を正しく学ぶ

于 2012-04-24T16:08:31.577 に答える
1

あなたのスクリプトはいたるところにあります

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

一時名を取得するには$_FILES['bf_file']['tmp_name'][$key]、ファイルサイズが既に返されている必要があります$_FILES['bf_file']['size'][$key]

同様の質問の詳細な例を見てみましょう

ファイルのアップロード時に複数の画像をアップロードすると、数量が間違っています

配列の助けを借りて画像をアップロードし、エラーを取得する

于 2012-04-24T15:47:25.700 に答える
0

最も安全なアプローチは、ユーザーが完全にアップロードできるフォルダーでWebサーバーが動的なものを実行しないようにすることです。その後、彼らが何をアップロードするかは問題ではありません。

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

于 2012-04-24T16:42:22.837 に答える