Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: toti84 в May 20, 2008, 12:52



Титла: Малко помощз за upload скирпт на php
Публикувано от: toti84 в May 20, 2008, 12:52
Здравейте,
В момента скрипта ми работи иделано, но ми трябва да го моделирам така, че когато файла се качи на сървъра, да бъде с променено име, което име да се определя от някаква променлива (примерно $ime).

Ето и как изглеждат:

index.html:
Примерен код
<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>


и upload_file.php:

Примерен код

<?php

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "/opt/lampp/htdocs/upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>


Благодаря предварително...


Титла: Малко помощз за upload скирпт на php
Публикувано от: VladSun в May 20, 2008, 13:30
;)
Използвай $ime за втори параметър на move_uploaded_file()

Кодът ти обаче е *доста* зле откъм сигурност:
- не си използвал is_uploaded_file() за да провериш дали не се мести примерно "/etc/passwd" в уеб директорията ;) Не че ще стане, но предпочитам да те поуплаша ;)
- проверката за типа на файла (image/gif и т.н.) се осланя на подадена от потребителя информация, която *много* лесно може да бъде променена;
- никога не използвай оригиналното име, особено когато не си го "изчистил" от специални стрингове (от сорта на .. или /) :)

Ако в момента използваш този скрипт, то знай, че си отворен към атаки.

Един вариант е да използваш getimagesize() за да провериш дали качваният файл е изображение (макар и там да имаше начини да се качи PHP).





Титла: Малко помощз за upload скирпт на php
Публикувано от: toti84 в May 20, 2008, 14:09
Благодаря за бързия отговор, но се получава малка засечка:
1, Успешно се слага друго име, но не мога да се оправя с раширенята (примерно .gif)
ета как го правя:
Примерен код

$ime=33.gif;
.
.
move_uploaded_file($_FILES["file"]["tmp_name"],
     "/opt/lampp/htdocs/upload/" . $ime]);
     echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
.
.

на сървъра името е "33gif"



Цитат
- проверката за типа на файла (image/gif и т.н.) се осланя на подадена от потребителя информация, която *много* лесно може да бъде променена;

Просто този файл е примерен, аз ще се опивам да качвам ".swf"



Цитат
- никога не използвай оригиналното име, особено когато не си го "изчистил" от специални стрингове (от сорта на .. или /) :)

Тук не мога да те разбера...

Цитат
- не си използвал is_uploaded_file() за да провериш дали не се мести примерно "/etc/passwd" в уеб директорията ;) Не че ще стане, но предпочитам да те поуплаша ;)


Тук също не мога да те разбера...


Титла: Малко помощз за upload скирпт на php
Публикувано от: VladSun в May 20, 2008, 14:20
Примерен код
$ime=33.gif;
стринговете в PHP се ограждат в кавички.

Цитат
Просто този файл е примерен, аз ще се опивам да качвам ".swf"

В момента мога да изпратя MIME type: image/gif, а да кача PHP файл...

RTM:
http://bg2.php.net/is_uploaded_file


Титла: Малко помощз за upload скирпт на php
Публикувано от: VladSun в May 20, 2008, 14:29
Най-лесно - потърси в google за "php secure picture file upload":
http://www.scanit.be/uploads/php-file-upload.pdf





Титла: Малко помощз за upload скирпт на php
Публикувано от: toti84 в May 20, 2008, 14:56
Благодрая много последно оставям файла така:
Примерен код

<?php
$ime='first.swf';

if (is_uploaded_file($_FILES['file']['tmp_name'])) {
   echo "faila ". $_FILES['file']['name'] ." e kachen.\n";
     # readfile($_FILES['file']['tmp_name']);


if ($_FILES["file"]["size"] < 20000)
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("/opt/lampp/htdocs/upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      #"/opt/lampp/htdocs/upload/" . $_FILES["file"]["name"]);
      "/opt/lampp/htdocs/upload/" . $ime);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }


} else {
   echo "Вероятен опит за пробив в сигурността при качване на файл: ";
   echo "Файл '". $_FILES['file']['tmp_name'] . "'.";
}

?>


Титла: Малко помощз за upload скирпт на php
Публикувано от: VladSun в May 20, 2008, 15:39
Пак има пропуски - прим. XSS с името на файла.
Трябва ти нещо от сорта (модифицирай го за проверка на съдържание на *.swf файлове) на:
Примерен код

<?php

function image_upload($upload_dir)
{
        $allowed_type_extensions = array(
                                        'image/jpeg'    => 'jpeg',
                                        'image/pjpeg'   => 'pjpeg',
                                        'image/gif'     => 'gif',
                                );      

        if (empty($_FILES) || empty($_FILES['file']))
                throw new Exception('User file not specified.', 101);
        elseif (!is_uploaded_file($_FILES['file']['tmp_name']))
                throw new Exception('File is not a HTTP uploaded one.', 102);
        elseif (!($img_info = getimagesize($_FILES['file']['tmp_name'])))
                throw new Exception('File is not an image.', 103);
        elseif (empty($allowed_type_extensions[$img_info['mime']]))
                throw new Exception('File is not an allowed image format.', 104);
        else
        {
                do
                        $temp_name = md5(microtime().'salt_here_$#%^$^&$#%^').'.'.$allowed_type_extensions[$img_info['mime']];
                while (file_exists($upload_dir.'/'.$temp_name));
                
                if (!move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir.'/'.$temp_name))
                        throw new Exception('Could not move file to destination directory.', 105);
                else
                        return $temp_name;
        }
}
?>






Титла: Малко помощз за upload скирпт на php
Публикувано от: toti84 в May 21, 2008, 16:16
Благодаря за отделеното време