Отправляет email-рассылки с помощью сервиса Sendsay

[TC] Как ещё послать файлик (PHP)?

Vande omentaina, Tiflocomp!
Народ, тут эксперты говорят, что метод post жутко-страшно
небезопасный для отправки файлов.
Задача: надо дать возможность юзерам отправлять файлы на сервер.
Вопрос: как её решить, не используя метод post?
Спасибо!

Ответить   Anarendil Mon, 2 Mar 2009 02:27:03 +0200 (#828131)

 

Ответы:

Приветствую всех.

Андрей пишет:

Надо бы уточнить, что значит "небезопасный" (а главное, для кого?), а также в
сравнении с чем, такая как бы оценка была вынесена как бы экспертами.
Метод POST это один из методов, специфицированных в протоколе http (например,
1.1), поэтому не совсем понятно, во-первых, о небезопасности чего все-таки идет
речь: именно метода или протокола в целом; во-вторых, вопрос касается смены метода
или смены протокола передачи данных?
Для изменения данных на сервере в http предусмотрено три метода: POST, PUT и
DELETE. Эти методы, согласно спецификации, относятся к небезопасным (в терминологии
этой спецификации).
Метод PUT предназначен для непосредственного изменения файлов на сервере, т.е.
предполагается, что на сервер передается новое содержимое, которое должно быть
доступно по url, указанному в запросе. По умолчанию апач игнорирует запросы с
этим методом (если в настройках не указан cgi-скрипт, который будет обрабатывать
такие запросы).
Метод DELETE предназначен для удаления содержимого, которое на момент посылки
запроса доступно по url, указанному в запросе.

php поддерживает работу с методами POST и PUT и делает это максимально безопасно
(насколько это возможно).

Вы либо меняете протокол (в широком и в узком смысле), либо метод. Но чтобы сделать
выбор, надо понять, от какой уязвимости вы хотите избавиться.

Успехов. Анатолий.

Ответить   "i_chay" Tue, 3 Mar 2009 05:46:18 +0400 (#828607)

 

Vande omentaina, i_chay!

сделать

Дело вот в чём.
Мы недавно сменили хостера. А у нас тут предполагаются быть проекты, в
которых юзеры должны грузить на сервер текстовые и графические файлы.
Однако вот такой скрипт:
<?
$upldir="uploads";
$tmp_name = $_FILES["uf"]["tmp_name"];
$name = $_FILES["uf"]["name"];
move_uploaded_file($tmp_name, "$upldir/$name");

где uf - значение атрибута name тега input в форме, даёт ворнинги,
сообщающие, что невозможно переместить файл из временной директории,
поскольку access denied.
Я, ессно, пошёл к ним с вопросами. А они мне сказали в том духе, что
метод post жутко небезопасный и вообще зачем мне для этого post.
Вот я и задался вопросом, можно ли как-то это дело обойти, чтобы не
вступать с ними в полемику: похоже, изменить настройки их не
заставишь...
Спасибо!

Ответить   Anarendil Tue, 3 Mar 2009 13:11:25 +0200 (#828743)

 

Приветствую всех.

Андрей пишет:

А для целевого каталога установлены нужные права?
Если установлены, то получается интересная картина: временный каталог доступен
всем на запись, но недоступен для чтения? Понять бы еще смысл такого решения...

Атрибут method в теге FORM не допускает никаких иных значений, кроме GET и POST
(по крайней мере в спецификации HTML 4.01, да и в XHTML вряд ли это дело изменилось).
Кроме того, чтобы передать файл методом PUT, его должен поддерживать пользовательский
клиент (и у меня есть подозрение, что ни один из популярных браузеров этого не
делает).
Других методов, позволяющих передавать файлы на сервер, в спецификации http не
предусмотрено (есть еще PATCH, но это практически аналог PUT).

php при обработке метода PUT читает поступающие данные из стандартного потока
ввода (без временных каталогов), но см. выше вопрос о том, как клиент сформирует
такой запрос .
Можно, конечно, утилитку найти или написать, которая будет отправлять файлы этим
методом, и предлагать посетителям загружать файлы с ее помощью...
Можно еще попробовать через .htaccess изменить временный каталог для загружаемых
файлов.
Но все это выглядит очень странно для платного хостинга.

Успехов. Анатолий.

Ответить   "i_chay" Tue, 3 Mar 2009 18:12:14 +0400 (#828815)

 

Vande omentaina, i_chay!

А Моргот их знает...
интересно, что я не могу зайти туда даже по FTP (access denied,
опять-таки). Прочмодить я её тоже не могу, говорит, это может сделать
только владелец. Из их контроль-панели (того самого ISP Manager'а, с
которым вы же мне, Анатолий, очень сильно помогли) тоже ничего не
получается.
Кстати, действительно она (директория tmp) доступна всем на запись, но
не на чтение. И ворнинг идёт о ней же, об этой директории.
А хостеры такие, что на любые вопросы отвечают чем-нибудь вроде
RTFM... Типа я новичок и ничего не понимаю. Но я на трёх хостах это
дело опробовал и всё вроде бы было нормально...
Интересно, а можно как-то юзеров заставлять средствами php закачивать
файлы по иному протоколу, например, FTP?

Ответить   Anarendil Wed, 4 Mar 2009 01:47:57 +0200 (#828994)

 

Приветствую всех.

Андрей пишет:

Для любого протокола нужно, чтобы его поддерживали обе стороны (т.е. в данном
случае у пользователя должен быть ftp-клиент, а на сервере должен работать ftp-сервер).
И в каком смысле "заставлять" средствами php? Вы хотите на php реализовать ftp-сервер?
В принципе, это можно сделать через сокеты.
Например:
http://www.whenpenguinsattack.com/2007/03/05/an-ftp-server-written-in-php/
Правда, данный вариант не предназначен непосредственно для использования на web-сайте,
но можно попытаться адаптировать.

Существует еще ftp-сервер на perl:
Net::FTPServer - A secure, extensible and configurable Perl FTP server
http://search.cpan.org/~rwmj/Net-FTPServer-1.122/lib/Net/FTPServer.pm

Наверное, есть еще что-нибудь подобное.
Это все на тот случай, если у вас запрещен анонимный доступ по ftp.

Если у вас разрешено предоставление анонимного ftp доступа, то можно поместить
на странице ftp-ссылку на каталог для загрузки файлов. Но это будет обычный
доступ по ftp, т.е. php тут никак не задействуется (разве только для автоматизации
перемещения файлов из общего каталога).
В любом случае пользователи должны будут прибегнуть к помощи ftp-клиента, т.к.
браузеры, в общем случае, это http-клиенты (правда, IE имеет встроенный ftp-клиент).

Успехов. Анатолий.

Ответить   "i_chay" Wed, 4 Mar 2009 10:18:58 +0400 (#829061)

 

Vande omentaina, i_chay!

т.к.

Жууууть...
Тогда вернёмся к нашей проблеме с директорией tmp и невозможностью её
считать.
вот кусок переписки на форуме.
Мой пост:

Сорри, может, конечно, я тупой, но я только что проверил на другом абсолютно
хосте, там закачивается без ошибок.
1. Создал директорию uploads в текущей директории (где лежит скрипт).
2. Написал файл формы:
<html>
<title>Upload a file</title>
<body>
<form action="gotit.php" method=post ENCTYPE="multipart/form-data">
<input type=file name=uf>
<input type=submit name="go" value="закачать">
</form>
</body>
</html>
3. Написал такой скрипт:
<?
$upldir="uploads";
$tmp_name = $_FILES["uf"]["tmp_name"];
$name = $_FILES["uf"]["name"];
move_uploaded_file($tmp_name, "$upldir/$name");

На что мне тут выдаёт вот такое:
Warning: move_uploaded_file(uploads/texts.doc) [function.move-uploaded-file]:
failed to open stream: Permission denied in /usr/home/arthaelon/data/www/arthaelon.net/gotit.php
on line 5
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/usr/home/arthaelon/data/tmp/phpPxUeLG'
to 'uploads/texts.doc' in /usr/home/arthaelon/data/www/arthaelon.net/gotit.php
on line 5
повторюсь, на платформе другого проекта файлик texts.doc миленько ложится в директорию
uploads.

На что один форумчанин отвечает:

надеюсь разберетесь что у вас не так ;-)

Код:
$uplink=$_SERVER["DOCUMENT_ROOT"]."/".$upldir.$uplfname;
if (move_uploaded_file($_FILES['pl_photo']['tmp_name'],$uplink )) {

и еще: избегайте по возможности вот такого
"$_переменная блаблабла" кода.

Вопрос: чего я всё-таки делаю
не так??? Ну не врубаюсь,
извините...(
Спасибо!

Ответить   Anarendil Wed, 4 Mar 2009 18:08:41 +0200 (#829251)

 

Приветствую всех.
Андрей пишет:

[...]

'/usr/home/arthaelon/data/tmp/phpPxUeLG'

Все-таки у вас проблемы не с временным каталогом, а с указанием целевого каталога.
По всей видимости, текущий каталог при выполнении скриптов на этом хостинге не
совпадает с местоположением скрипта, поэтому будут сложности с использованием
относительных путей.

Вам предлагают для целевого файла указать полный путь.

такого

Спорное утверждение (и не приведена аргументация).
На это можно, например, возразить в том духе, что суперглобалы в php, как правило,
доступны только для чтения, поэтому такой код более безопасен, чем присваивание
значения пользовательской переменной (не говоря уже о затратах памяти и времени
на копирование).

Успехов. Анатолий.

Ответить   "i_chay" Thu, 5 Mar 2009 07:15:45 +0400 (#829409)

 

Vande omentaina, i_chay!

правило,

Как в том анекдоте: нутром чуял, что литр, а как выразить, не знал).
ППКС).
Кстати, а вот тут:

в $upldir уже надо слэшик конечный включать, как я понимаю?
И ещё: почему же у меня проблема с целевым каталогом, если, судя по
первому ворнингу, невозможно переместить из временного? Или он так
ругается на то, что перемещать некуда, собсно?

Ответить   Anarendil Thu, 5 Mar 2009 19:43:20 +0200 (#829659)

 

Приветствую всех.

Андрей пишет:

Надо. Кстати, каталог, где лежит скрипт можно получить так: dirname(__FILE__)
(это на тот случай, если у вас путь включает несколько вложенных каталогов и
вы их наизусть не помните).

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

Успехов. Анатолий.

Ответить   "i_chay" Thu, 5 Mar 2009 23:10:12 +0400 (#829683)