Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: POST Content-Length of X bytes exceeds the limit of Y bytes in Unknown on line 0
Форумы портала PHP.SU » PHP » Программирование на PHP » POST Content-Length of X bytes exceeds the limit of Y bytes in Unknown on line 0

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

1. Polaris - 02 Апреля, 2010 - 06:27:13 - перейти к сообщению
Версия 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 с контролем количества вводимых символов и принудительной обрезкой.

Что это вообще такое и как это лечить?
2. JustUserR - 02 Апреля, 2010 - 17:08:25 - перейти к сообщению
Polaris пишет:
Но проблема в том, что у меня форма для заливки файлов только в админке, куда доступ ограничен моим ip и запаролен через htaccess
В принципе если ваш PHP-скрипт не закрыт firewall-ом и HTTP-запросы до него доходят - то ничто не мешает посылать на него длинные POST-запросы с файлами возможно в целях взлома - ведь даже если сам PHP-скрипт выдаст ошибку о том что соотвествующих прав нет то он выдаст это после загрузки файлов
Есть одно очень важное правило PHP - загрузка всех GET/POST-запросов происходит ДО начала исполнения PHP-кода из вашего PHP-скрипта - и вы никак внутри него не можете контролировать размер передаваемого файла - разве что размерами лимитирующий переменных в php.ini Из-за этого правила полностью на PHP нельзя реализовать загрузчик файлов с прогресс-баром и вероятно это правило сказывается у вас
3. Polaris - 05 Апреля, 2010 - 05:57:39 - перейти к сообщению
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-трафик на сервере, что в общем-то нежелательно...
Есть ли какие-то возможно общие рекомендации, помимо закрытия фаерволом доступа на админку?
4. JustUserR - 05 Апреля, 2010 - 11:49:22 - перейти к сообщению
Polaris пишет:
Есть ли какие-то возможно общие рекомендации, помимо закрытия фаерволом доступа на админку?
Вообще любые решения связанные с запретом доступа с помощью средств Apache или PHP-скрипта довольно бессмысленно - по причине того что HTTP-запрос целиком уже полностью принят web-сервером к тому моменту как он выводит сообщение об ошибке доступа - то есть даже если у пользователя нет прав он все равно сможет слать HTTP-запросы не превышающие разрешенную длину
Как вариант можно использовать для админки отдельный CGI-скрипт в режиме NPH - он будет самостоятельно получать HTTP-запрос от пользователя и если к моменту окончания HTTP-заголовка становится очеидно что он не имеет прав доступа то обрывать соединение На PHP такое не выйдет по вышеуказанным причинам
5. Polaris - 05 Апреля, 2010 - 12:34:42 - перейти к сообщению
JustUserR пишет:

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


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

 

Powered by ExBB FM 1.0 RC1