почему мой загружаемый код изображения принимает файлы avi и flv

Я пишу 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);

}


person kaboom    schedule 09.07.2012    source источник
comment
где вы фильтруете только изображения?   -  person javajavajava    schedule 10.07.2012
comment
возможный дубликат Загрузка файла ограничивает определенный тип файла   -  person    schedule 10.07.2012
comment
Похоже, вы только проверяете, имеет ли файл расширение и не равен ли размер файла 0 и меньше 5 МБ. Бьюсь об заклад, вы можете загрузить любой файл на него   -  person Wug    schedule 10.07.2012
comment
Разве это не $_FILES[файл][тип]?   -  person madflow    schedule 10.07.2012
comment
^^^^ зависит от имени, используемого в форме OP.   -  person    schedule 10.07.2012


Ответы (2)


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

Комментарий к этой строке в корне вводит в заблуждение. Ключ size в $_FILES — это размер файла в байтах; это не имеет ничего общего с тем, является ли «файл изображением». (В частности, это не физический размер изображения.)

Если вам нужно проверить, является ли файл изображением, лучше всего использовать getimagesize< /а> функция. Эта функция вернет размер изображения, если это тип изображения, распознаваемый PHP, или ноль, если оно не похоже на изображение.

Не используйте поле type массива $_FILES, чтобы определить, является ли файл изображением. Это поле заполняется браузером, а не сервером, и может содержать вводящую в заблуждение и/или откровенно неверную информацию.

person Community    schedule 09.07.2012

Не ответ, но ваш код очень уязвим для атак:

1) Вы не проверяете успешность загрузки и предполагаете, что это действительно удалось. Всегда проверяйте наличие ошибки загрузки, прежде чем что-либо делать:

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

2) Вы используете поле ['type'] для проверки. Это значение ПРЕДОСТАВЛЯЕТСЯ ПОЛЬЗОВАТЕЛЕМ, и ему нельзя доверять. Злоумышленник может тривиально манипулировать этим значением, чтобы сказать image/jpeg, но при этом загрузить nastyvirus.exe.

3) Вы используете поле ['name'] для хранения на своем сервере. Это также данные, предоставляемые пользователем, и ими можно легко манипулировать, включая информацию о пути, например. ../../../../../../../etc/passwd. Поскольку вы используете его вслепую, вы позволяете злоумышленникам копаться в любом файле на вашем сервере, к которому у веб-сервера есть доступ.

person Marc B    schedule 09.07.2012
comment
спасибо, что указали на них. Не подскажете, как исправить номер 3? Спасибо - person kaboom; 10.07.2012