Проблема с загрузкой нескольких файлов PHP - PullRequest
0 голосов
/ 09 апреля 2011

На моем сайте есть страница, на которой пользователи могут загружать файлы вместе с новостями, которые они добавляют.Я разрешаю им загрузить одно изображение и один звуковой файл.Им не нужно добавлять файлы, если они этого не хотят, или они могут просто добавить один, если захотят.У меня проблема в том, что мой скрипт работает, только если пользователь выбирает оба файла.Если они выбирают ни одного, или только один, то скрипт выдает «Invalid File», так как не может найти файл, в котором он не был выбран.

Я пытался использовать:

if (isset($_FILES['filetoupload1'])) { 
    if (($_FILES["filetoupload1"]["type"] == "image/gif")
        || ($_FILES["filetoupload1"]["type"] == "image/jpeg")
        || ($_FILES["filetoupload1"]["type"] == "image/pjpeg")
        || ($_FILES["filetoupload1"]["type"] == "image/png")
        || ($_FILES["filetoupload1"]["type"] == "image/jpg")
    ) {
        if ($_FILES["filetoupload1"]["error"] > 0) {
            echo "Return Code: " . $_FILES["filetoupload1"]["error"] . "<br />";
        } else {
        if (file_exists("media/" . $_FILES["filetoupload1"]["name"])) {
                echo $_FILES["filetoupload1"]["name"] . " already exists. ";
            }
            move_uploaded_file(
                $_FILES["filetoupload1"]["tmp_name"],
                "media/" . $_FILES["filetoupload1"]["name"]
            );
        }
    } else {
        echo "Invalid file";
    }
}


if (isset($_FILES['filetoupload2'])) { 
    if ($_FILES["filetoupload2"]["type"] == "audio/mp3") {
        if ($_FILES["filetoupload2"]["error"] > 0) {
            echo "Return Code: " . $_FILES["filetoupload2"]["error"] . "<br />";
        } else {
        if (file_exists("media/" . $_FILES["filetoupload2"]["name"])) {
                echo $_FILES["filetoupload2"]["name"] . " already exists. ";
            }
            move_uploaded_file(
                $_FILES["filetoupload2"]["tmp_name"],
                "media/" . $_FILES["filetoupload2"]["name"]
            );
        }
    } else {
        echo "Invalid file";
    }
}

, а затем

if((isset($_FILES['filetoupload1'])) && (isset($_FILES['filetoupload2']))) { }

перед первым и вторым сценариями загрузки, если пользователь выбрал изображение и аудиофайл.Другими словами, он сделал это:

if filetoupload1 isset then run upload script that filters images.
if filetoupload2 isset then run upload script that filters audio.
if filetoupload1 AND filetoupload2 isset then run both upload scripts.

У меня это настроено так.Выше следует учитывать все комбинации загрузки файлов.право?но это не работает так ..

Теперь я понятия не имею, что делать.Вот сценарий загрузки аудио, изображение одно и то же:

Может кто-нибудь сказать мне, что я делаю не так, пожалуйста!

Ответы [ 3 ]

2 голосов
/ 09 апреля 2011

«Я получаю сообщение об ошибке: Неверный файл»

Это правильно, поскольку ваш код просто делает это.Не проверяйте, установлен ли файл, но если то есть $_FILES["filetoupload1"]["type"] не пусто.

1 голос
/ 09 апреля 2011

Я предлагаю вам добавить скрытый текст, этот скрытый будет проверять, активны ли поля загрузки, вы делаете эту проверку с помощью javascript:

<html lang="en">
<head>
<meta charset="utf-8">
<style>

 </style>

<script type="text/javascript">
function uploadForm()
{
var size = 0;
var x = document.forms["myForm"]["upload1"].value.length;
var y = document.forms["myForm"]["upload2"].value.length;
if (x > 0)
  {
  size = 3;
  }
if (y > 0)
 {
  size += 2;
 }
 return size;
}
</script>

</head>
<body>


<form name="myForm" action="" method="GET" onsubmit="chose.value = uploadForm()">
<input type="file" name="upload1"><br>
<input type="file" name="upload2"><br>
<input type="hidden" name="chose" value=""><br>
<input type="submit" value="Submit">
</form>


</body>
</html>

Теперь, когда вы получаете форму, вы должныпроверьте значение выбранного поля, если оно равно 2, то есть поле изображения не пустое, 3 аудиофайла не пустое, 5 оба не пустые:

<?php
switch($_GET["chose"])
 {
case 2:
//
 break;
case 3;
//
break;
case 5:
//
break;
default:
// here the user doesn't use any field

}
?>
1 голос
/ 09 апреля 2011

Ваш сценарий делает ваш сервер уязвимым для злоумышленника, который может топнуть любой файл, к которому у веб-сервера есть доступ:

$_FILES[...]['name'] - user supplied
$_FILES[...]['type'] - user supplied

Вы доверяете, что клиент предоставил правильный тип MIME для файла, но ничто не мешает кому-то подделать запрос и загрузить «virus.exe» и установить для типа mime значение «image / jpeg». Кроме того, поскольку удаленное имя файла находится под контролем пользователя, оно может быть уничтожено вредоносными данными. Рассмотрим:

$_FILES['picture']['type'] = 'image/gif'
$_FILES['picture']['name'] = 'remote_server_control.php'

Полностью законно в соответствии с вашим сценарием, потому что тип MIME "правильный", и все же вы теперь поставили пользовательский PHP-сценарий на ваш сервер, и с этим они могут получить полный контроль над вашим сайтом и / или сервером .

НИКОГДА не доверяйте данным в массиве $_FILES. Всегда определяйте типы MIME через утилиты на стороне сервера. Если сценарий должен обрабатывать только изображения, используйте getimagesize(). Кроме того, никогда не используйте предоставленные пользователем имена файлов. Используйте что-то определенное на стороне сервера, чтобы дать файлу имя, например, идентификационный номер auto_increment базы данных. Даже несмотря на то, что ваш код не позволяет перезаписывать существующие файлы, просто придумать новое имя и бум ... новую версию сценария удаленного поглощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...