Автор Тема: Малко помощз за upload скирпт на php  (Прочетена 4568 пъти)

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Здравейте,
В момента скрипта ми работи иделано, но ми трябва да го моделирам така, че когато файла се качи на сървъра, да бъде с променено име, което име да се определя от някаква променлива (примерно $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";
  }
?>


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

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Малко помощз за upload скирпт на php
« Отговор #1 -: May 20, 2008, 13:30 »
'<img'>
Използвай $ime за втори параметър на move_uploaded_file()

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

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

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



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Малко помощз за upload скирпт на php
« Отговор #2 -: 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"



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

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

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


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

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Малко помощз за upload скирпт на php
« Отговор #3 -: May 20, 2008, 14:20 »
Примерен код
$ime=33.gif;
стринговете в PHP се ограждат в кавички.

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

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

RTM:
http://bg2.php.net/is_uploaded_file
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Малко помощз за upload скирпт на php
« Отговор #4 -: May 20, 2008, 14:29 »
Най-лесно - потърси в google за "php secure picture file upload":
http://www.scanit.be/uploads/php-file-upload.pdf



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Малко помощз за upload скирпт на php
« Отговор #5 -: 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'] . "'.";
}

?>
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Малко помощз за upload скирпт на php
« Отговор #6 -: 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;
        }
}
?>




Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

toti84

  • Напреднали
  • *****
  • Публикации: 115
    • Профил
Малко помощз за upload скирпт на php
« Отговор #7 -: May 21, 2008, 16:16 »
Благодаря за отделеното време
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Проблем с шейп на upload-a
Хардуерни и софтуерни проблеми
vegetzo 1 1999 Последна публикация Jun 05, 2004, 14:41
от Филип Бонев
Torrent upload към чужбина
Идеи и мнения
NimroD 2 2014 Последна публикация Nov 20, 2006, 16:34
от NimroD
Upload на файлове за сайт директно през ftp
Настройка на програми
mircata 0 1428 Последна публикация Jan 26, 2007, 10:13
от mircata
Proftpd upload problem
Настройка на програми
Boiler 7 3058 Последна публикация Nov 23, 2007, 01:02
от alabal
Проблем с upload
Web development
console 1 2249 Последна публикация Jul 18, 2008, 15:53
от VladSun