защо моят код за изображение за качване приема 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 MB. Обзалагам се, че можете да качите всеки файл в него   -  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< /a> функция. Тази функция ще върне размера на изображение, ако то е тип изображение, което 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