0

ユーザーが画像を送信してサーバーにアップロードできるようにするPHPコードを作成します。私はそれを機能させ、サーバーは画像を受け取ります。しかし、サーバーは .avi ファイルや .flv ファイルも受け入れているようです。ファイルが画像であるかどうかを確認する if/else ステートメントを書いていますが、なぜ機能しないのですか? ありがとうございました

これは私のphpコードです

$tmpPath = $_FILES["image"]["tmp_name"];
$movedPath = "submit-img/" . $_POST["category"] . "/" . $_FILES["image"]["name"];

$fullURL = parse_url($_SERVER['HTTP_REFERER']);
$query = explode("&", $fullURL["query"]); //only choose first query
$prevPage = "gallery.php" . "?" . $query[0];

//I get the file type here
$fileType = strpos($_FILES["image"]["type"], "image/");

//if its not an image then redirect to the previous page and send a message
if ($fileType === false || ($_FILES["image"]["size"]) == 0 || $_FILES["image"]["size"]/1024 > 5000){
    $prevPage = $prevPage . "&imgSubmit=none#imgSubmitForm";
    header("Location: " . $prevPage);
}else if ($_FILES["image"]["size"] > 0){ //if file is an image
    if (!is_file($movedPath)){
        move_uploaded_file($tmpPath, $movedPath);
    }else{
        while (is_file($movedPath)){    
            $extension = strrchr($movedPath, ".");
            $movedPath = str_replace($extension, "", $movedPath) . "1" . $extension;
        }
        move_uploaded_file($tmpPath, $movedPath);
    }
    $prevPage = $prevPage . "&imgSubmit=submitted#imgSubmitForm";
    header("Location: " . $prevPage);

}

4

2 に答える 2

0
}else if ($_FILES["image"]["size"] > 0){ //if file is an image

この行のコメントは根本的に誤解を招くものです。sizeキー$_FILESは、ファイルのサイズ (バイト単位) です。「ファイルが画像かどうか」とは関係ありません。(特に、画像の物理的なサイズではありません。)

ファイルが画像かどうかをテストする必要がある場合は、関数を使用するのが最善の策getimagesizeです。この関数は、PHP が認識できる画像タイプの場合は画像のサイズを返し、画像ではない場合はゼロを返します。

ファイルがイメージかどうかを判断するためtypeに、配列のフィールドを使用しないでください。$_FILESこのフィールドは、サーバーではなくブラウザによって入力され、誤解を招く情報や完全に間違った情報が含まれている可能性があります。

于 2012-07-09T20:33:20.087 に答える
0

答えではありませんが、あなたのコードは攻撃に対して非常に脆弱です:

1) アップロードの成功を確認せず、DID が成功したと想定します。何かを行う前に、アップロードの失敗を常に確認してください。

if ($_FILES['image']['error'] !== UPLOAD_ERR_OK) {
   die("Upload failed with error code " . $_FILES['image']['error']);
}

2)['type']検証のためにフィールドを使用しています。これは USER-SUPPLIED 値であり、信頼できません。悪意のあるユーザーは、その値を簡単に操作して、image/jpegアップロードしていると言いnastyvirus.exeます。

3)['name']サーバーに保存するためにフィールドを使用しています。これもユーザー提供のデータであり、簡単に操作してパス情報を含めることができます../../../../../../../etc/passwd。やみくもに使用しているため、悪意のあるユーザーが、Web サーバーがアクセスできるサーバー上の任意のファイルに落書きすることを許可しています。

于 2012-07-09T20:36:12.857 に答える