PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Polaris
Отправлено: 02 Апреля, 2010 - 06:27:13
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Авг. 2008  


Помог: 0 раз(а)




Версия php 5.2.10.
Стабильно вижу в логах такую ошибку 5-6 раз в день. В принципе, нагуглил и прочитал про это вот что:

Цитата:

Закачка файлов в PHP: не забываем про post_max_size
PHP // 24 Января, 2008 // под утро
Обычное дело ограничить размер закачиваемых файлов при помощи upload_max_filesize, но в конфигах есть еще одна важная опция post_max_size, ограничивающая размер POST-данных (соотношение должно быть такое memory_limit > post_max_size > upload_max_filesize). Думаю php-разработчикам, читающим мой блог будет интересно узнать об одном side-effect’е, который до некоторого времени считался багом типа documentation issue (т.е. не был никак описан) и о котором я сам даже не подозревал.

Как следует из определения, post_max_size ограничивает размер передаваемых данных, поэтому php резервирует в памяти буффер именно этого размера. Что происходит, если объем данных больше этой величины (например закачиваемый файл имеет размер больше ожидаемого)? Все очень просто — php сбрасывает $_POST и $_FILES, как если бы upload вобще не происходил, при этом в логах следующее:

PHP Warning: POST Content-Length of X bytes exceeds the limit of Y bytes in Unknown on line 0Это и есть тот самый side-effect. Действительно, если в буфер влезает только часть POST-данных, то php-скрипт может повести себя непредсказуемо. Чтобы минимизировать ущерб — php не передаст в ваш скрипт вообще ничего.

Если срабатывает ограничение upload_max_filesize, мы можем об этом узнать из массива $_FILES, его соответствующий элемент ‘error’ будет содержать код ошибки UPLOAD_ERR_INI_SIZE. В случае же срабатывания ограничения post_max_size, как я уже описал, $_FILES пустой, а ошибку сдетектировать и пользователю написать надо. К счастью нам все еще доступен $_GET, поэтому решаем добавлением GET-параметра в action атрибут нашей формы:

<form enctype="multipart/form-data" method="post" action="?doing_upload=1">
...
</form>Теперь в скрипте, принимаюшем форму мы можем проверить существование параметра doing_upload и что $_FILES на самом деле пустой и красиво сказать пользователю, что он неправ. Примерно так:

if (isset($_GET['doing_upload']) &&
(! isset($_FILES) || (count($_FILES) == 0)))
print "Sorry, post_max_size is in effect";Если с закачкой файла в вашей форме есть еще какие-нибудь поля, то вы можете их потерять, если пользователь ошибётся с размером файла и при этом не знает о существовании кнопки Back (бывает и такое). Поэтому я рекомендую форму закачки файла вообще засунуть в отдельный iframe. Главный совет: если у вас в проекте есть форма закачки файлов, попробуйте превысить post_max_size и посмотрите как ваше приложение сможет с этим справиться.

Положите эту мелочь на свою полочку знаний и не повторяйте моих ошибок


Но проблема в том, что у меня форма для заливки файлов только в админке, куда доступ ограничен моим ip и запаролен через htaccess. Сообщения появляются, когда в админке я ничего не делаю.
В остальном на сайте есть формы, но без заливки файлов - обычные input и textarea с контролем количества вводимых символов и принудительной обрезкой.

Что это вообще такое и как это лечить?

(Отредактировано автором: 02 Апреля, 2010 - 07:17:55)

 
 Top
JustUserR
Отправлено: 02 Апреля, 2010 - 17:08:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Polaris пишет:
Но проблема в том, что у меня форма для заливки файлов только в админке, куда доступ ограничен моим ip и запаролен через htaccess
В принципе если ваш PHP-скрипт не закрыт firewall-ом и HTTP-запросы до него доходят - то ничто не мешает посылать на него длинные POST-запросы с файлами возможно в целях взлома - ведь даже если сам PHP-скрипт выдаст ошибку о том что соотвествующих прав нет то он выдаст это после загрузки файлов
Есть одно очень важное правило PHP - загрузка всех GET/POST-запросов происходит ДО начала исполнения PHP-кода из вашего PHP-скрипта - и вы никак внутри него не можете контролировать размер передаваемого файла - разве что размерами лимитирующий переменных в php.ini Из-за этого правила полностью на PHP нельзя реализовать загрузчик файлов с прогресс-баром и вероятно это правило сказывается у вас


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Polaris
Отправлено: 05 Апреля, 2010 - 05:57:39
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Авг. 2008  


Помог: 0 раз(а)




JustUserR пишет:
В принципе если ваш PHP-скрипт не закрыт firewall-ом и HTTP-запросы до него доходят - то ничто не мешает посылать на него длинные POST-запросы с файлами возможно в целях взлома - ведь даже если сам PHP-скрипт выдаст ошибку о том что соотвествующих прав нет то он выдаст это после загрузки файлов
Есть одно очень важное правило PHP - загрузка всех GET/POST-запросов происходит ДО начала исполнения PHP-кода из вашего PHP-скрипта - и вы никак внутри него не можете контролировать размер передаваемого файла - разве что размерами лимитирующий переменных в php.ini Из-за этого правила полностью на PHP нельзя реализовать загрузчик файлов с прогресс-баром и вероятно это правило сказывается у вас


Да, у меня стоит ограничение на post_max_size 2M и upload_max_filesize 2M в php.ini. Заметил, что несколько увеличился входящий http-трафик на сервере, что в общем-то нежелательно...
Есть ли какие-то возможно общие рекомендации, помимо закрытия фаерволом доступа на админку?
 
 Top
JustUserR
Отправлено: 05 Апреля, 2010 - 11:49:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Polaris пишет:
Есть ли какие-то возможно общие рекомендации, помимо закрытия фаерволом доступа на админку?
Вообще любые решения связанные с запретом доступа с помощью средств Apache или PHP-скрипта довольно бессмысленно - по причине того что HTTP-запрос целиком уже полностью принят web-сервером к тому моменту как он выводит сообщение об ошибке доступа - то есть даже если у пользователя нет прав он все равно сможет слать HTTP-запросы не превышающие разрешенную длину
Как вариант можно использовать для админки отдельный CGI-скрипт в режиме NPH - он будет самостоятельно получать HTTP-запрос от пользователя и если к моменту окончания HTTP-заголовка становится очеидно что он не имеет прав доступа то обрывать соединение На PHP такое не выйдет по вышеуказанным причинам


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Polaris
Отправлено: 05 Апреля, 2010 - 12:34:42
Post Id


Новичок


Покинул форум
Сообщений всего: 40
Дата рег-ции: Авг. 2008  


Помог: 0 раз(а)




JustUserR пишет:

Как вариант можно использовать для админки отдельный CGI-скрипт в режиме NPH - он будет самостоятельно получать HTTP-запрос от пользователя и если к моменту окончания HTTP-заголовка становится очеидно что он не имеет прав доступа то обрывать соединение На PHP такое не выйдет по вышеуказанным причинам


эх, cgi не вариант - отключено вообще...
 
 Top
JustUserR
Отправлено: 06 Апреля, 2010 - 13:07:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Polaris пишет:
Эх, cgi не вариант - отключено вообще...
Это нехорошо потому что на чистом PHP данную проблему решить попросту невозможно по причине того что "загрузка всех GET/POST-запросов происходит ДО начала исполнения PHP-кода из вашего PHP-скрипта - и вы никак внутри него не можете контролировать размер передаваемого файла"
Мне известно что есть библиотека для PHP позволяющая изменить такое поведение ядра - но для этого нужно иметь собсвтенную версию PHP куда бы можно было установить данную бибилиотеку при сборке - а для этого опять нужен CGI
В общем омгу сказать что проблема более чем решаемая но нужно что-то большее чем классичесий PHP-скрипт


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB