0

重複の可能性:
PHP でアップロード時に特定のファイルタイプのみを許可するにはどうすればよいですか?

以下のスクリプトで .jpg 画像または .png 画像のみを許可するにはどうすればよいですか? セッションのユーザー名の一致に基づいて、イメージ ディレクトリを mysql テーブルにアップロードします。ファイルの種類を制限することはできますか? .jpg または .png しか必要ないため

 if ($_POST['submit']) {
    //get file attributes

    $Name = $_FILES['myfile']['name'];
    $tmp_name = $_FILES['myfile']['tmp_name'];
    error_reporting(E_ERROR | E_PARSE);

    if ($Name) {            
    $location = "avatars/$Name";    
    move_uploaded_file($tmp_name, $location ) or die('Failed to upload picture'); 
    $query = mysql_query("UPDATE fgusers3 SET imagelocation='$location' WHERE name='$name'") or die("Your profile image has been uploaded!");

   }}



echo "Upload your image below:
  <form action='profilepic.php' method='POST' enctype='multipart/form-data'>
   Profile Picture: <input type='file' name='myfile'> <input type='submit' name='submit' value='upload'>
   </form>";
4

6 に答える 6

1

pathinfo&を使用して試すことができますexif_imagetype

if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG)
{
    // throw error 
}

偽の画像を検出するための詳細情報を参照してください

于 2012-10-12T17:24:56.070 に答える
1
if($_FILES){
    $allowedExtensions = array("jpg","png");

    foreach($_FILES as $key=>$val){
        if(!empty($val['tmp_name'])){
            $ext = end(explode(".",strtolower(basename($val['name']))));
            if(in_array($ext,$allowedExtensions)){
                $file = 'PATH_TO_UPLOAD'.basename($val['name']);

                if(move_uploaded_file($val['tmp_name'],$file)){
                    //SUCCESS_MESSAGE
                }
            }else{
                //FAIL_MESSAGE
            }
        }
    }
}
于 2012-10-12T17:28:50.907 に答える
1

exif_imagetype($tmp_name)ヘッダーに基づいてファイルの実際のタイプを確認するために使用できます。これは、ファイルの内容に基づいてタイプをチェックするため、最も信頼性が高くなります (たとえば、誰かが「.png」拡張子の JPG を提供した場合でも、正しい情報が得られます)。

typeプロパティ ( )もあり$_FILES['myfile']['type']ます。これは、ブラウザがファイルを要求する MIME タイプを示します。ただし、誰かが悪意を持ってリクエストを偽造した場合、これは信頼できません。

于 2012-10-12T17:30:11.073 に答える
0
$whitelist = array(".jpg",".png");
foreach ($whitelist as $item) {
  if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) {
    $uploaddir='uploads/uploads_image/';
    // or code
  }
}
于 2012-10-12T17:27:47.633 に答える
0

$imageType = getimagesize($tmp_name); switch ($imageType['mime'] != "image/jpg" OR $imageType['mim'] != "image/png") { //ここにエラー コード。}

拡張子は簡単に変更できるので、拡張子を確認するよりも少し安全です。MIME タイプも変更できますが、より多くの知識が必要です xD

于 2012-10-12T17:33:50.193 に答える
0

もちろん、ファイル拡張子で制限することもできますが、安全ではありません。gif ファイルの名前を変更してアップロードしてみてください。少し安全なのは、MIME タイプを使用してファイル タイプを検出することです (ただし、保証はありません)。見てください: PHPでファイルのMIMEタイプを見つけるにはどうすればよいですか?

画像のサイズを取得しようとするか、別の画像タイプへの変換が成功した場合は、より安全だと思います。

于 2012-10-12T17:35:29.590 に答える