Проблема с загрузкой пользователя - PullRequest
0 голосов
/ 20 сентября 2011

Я пытаюсь написать функцию user_upload (), и она работает, но файлы изображений MIME-изображений не загружаются, но загружаются HTML-файлы.как я могу это исправить в этом скрипте?

function user_upload()
{
    $target_path = "uploads/".$_SESSION['username']."/";
    $client_ID = mysql_query("SELECT 'client_ID'
              FROM 'clients'
              WHERE username='".$_SESSION['username']."'");
        if(!empty($_FILES)){
            // Add the original filename to our target path.
            // Result is "uploads/filename.extension"
            $target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
                if((!$_FILES["uploadedfile"]["type"] == "image/gif")
                    ||(!$_FILES["uploadedfile"]["type"] == "image/png")
                    ||(!$_FILES["uploadedfile"]["type"] == "image/jpeg") // "jpeg" for Firefox
                    ||(!$_FILES["uploadedfile"]["type"] == "image/pjpeg") // "jpeg" for IE
                    ||(!$_FILES["uploadedfile"]["type"] == "text/css")
                    ||(!$_FILES["uploadedfile"]["type"] == "text/html")
                    ||(!$_FILES["uploadedfile"]["type"] == "text/javascript")
                    ||(!$_FILES["uploadedfile"]["type"] == "application/msword")
                    ||(!$_FILES["uploadedfile"]["type"] == "application/pdf")
                        &&(!$_FILES["file"]["size"] < 1000000)){
                            echo "The file is not of the right type or size. It should be a
                                    .gif, .png, .jpeg/.jpg, .css, .html, .javascript, .doc, or .pdf and under 1 billion kb.";

                            echo "If you need to send me a file different from these specification, feel free to
                                    email it to me at exaple@support.com. These specifications are for the website's safety.";
                                                              }else{
                                                                    if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
                                                                    mysql_query("INSERT INTO uploads(ID, URL) VALUES ('$client_ID', '$target_path')");
                                                              } else{
                                                                  echo "There was an error uploading the file, please try again!";
                                                              }
                                                }
        }
}

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Обычно я не делаю полный аудит кода, как это, но вот некоторые проблемы, которые я вижу с вашим кодом. Некоторые из них, возможно, связаны с вопросом, другие - это другие проблемы, которые я вижу.

Строка if(!empty($_FILES)){ должна быть if(isset($_FILES['uploadedfile'])){. Это связано с тем, что если кто-то загрузит файл с другим именем в поле ввода, ваш код все равно будет работать, выдав несколько ошибок.

Мне неудобно с этой строкой:

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

Я на 95% уверен, что базовое имя сделает это безопасным, но я бы чувствовал себя намного лучше, если бы существовало регулярное выражение, в котором белый цвет перечислял символы, которые разрешены в базовом имени. Например:

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
// allow only target paths in the form abc123.ext only
if (!preg_match('/^[a-z0-9 -]+\.[a-z0-9]+$/i', $target_path) {
     // invalid data, handle error
}

У меня есть два комментария к оператору if для типа.

Первое использование in_array, это значительно облегчит чтение и обслуживание кода.

Во-вторых, в операторе if произошла ошибка: последний || привязан к && для размера. Это связано с порядком операций . У вас есть что-то вроде a || (b && c), когда вы хотите (a || b) && c.

Принимая оба эти комментария, я написал бы ваш ifm Statemnet следующим образом.

$allowed_types = array("image/gif", "image/png", "image/jpeg", "image/pjpeg", "text/css", "text/html", "text/javascript", "application/msword", "application/pdf");
if(!in_array($_FILES["uploadedfile"]["type"], $allowed_types) || $_FILES["file"]["size"] >= 1000000) {

Последнее, что я хотел бы упомянуть о вашем коде, если есть возможность внедрения SQL. Если вы используете вышеупомянутое регулярное выражение, это должно обеспечить безопасность ввода, но, поскольку я считаю, что обеспечение безопасности никогда не бывает плохим, я бы использовал mysql_real_escape_string для дальнейшей очистки переменной $target_path. Как ниже:

$target_path = mysql_real_escape_string($target_path);
mysql_query("INSERT INTO uploads(ID, URL) VALUES ('$client_ID', '$target_path')");

Я не знаю, решит ли это какие-либо из ваших проблем, но эти проблемы нужно исправить в коде и могут помочь в отладке, почему ваш код не работает.

1 голос
/ 20 сентября 2011

Условие if неверно.Сделайте это if (((type == png) || (type == gif)) && (size < 1 billion kb)) ... вместо !type == png ....

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