Получать исходные данные

В соответствии с php manual или php://не вводит ни $HTTP_RAW_POST_DATA работу с multipart/form-data POST-запросами.

"php://позволяет вам читать необработанные POST-данные. Это менее интенсивно использующая память альтернатива $HTTP_RAW_POST_DATA и не нуждается в каких-либо специальных директивах php.ini. Вход php://недоступен с помощью enctype="multipart/form-data"".

Как я могу получить необработанные данные для форм multipart/form-data?

Ответ 1

Прямой ответ: вы не можете этого сделать. PHP настаивает на его разборе, всякий раз, когда он видит Content-Type multipart/form-data. Необработанные данные не будут доступны вам. К сожалению. Но вы можете взломать его.

Я столкнулся с аналогичной проблемой, партнер отправил неверно отформатированные данные в виде multipart/form-data, PHP не смог разобрать его и не выдавал, чтобы я сам разбирал его.

Решение? Я добавил это в свой apache conf:

<Location "/backend/XXX.php">
    SetEnvIf Content-Type ^(multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
    RequestHeader set Content-Type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE
</Location> 

Это изменит Content-Type входящего запроса на XXX.php из multipart/form-data в multipart/form-data-alternate, что достаточно, чтобы блокировать PHP от попытки его проанализировать.

После этого вы можете, наконец, прочитать все необработанные данные из ввода php://и самостоятельно проанализировать.

Это некрасиво, но я не нашел лучшего или фактически другого решения - не попросив партнера исправить свою сторону.

NB! Когда вы сделаете то, что я описал здесь, $_FILES будет пустым.

Ответ 2

Вы можете установить enable_post_data_reading = Off, а PHP не будет перехватывать данные multipart/form-data.

Требуется: PHP 5.4

Ответ 3

Я не реализовал это полностью, но похоже, что он должен работать. В Apache conf:

SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2
RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE
RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE

Настройка Content-Type на application/x-httpd-php появляется, чтобы решить исходную проблему PHP-анализа тела, а проблема Норберт Фаркас сообщила: "Apache отправляет исходный код PHP". Затем тело доступно на php://input и действительном типе содержимого в заголовке X-Real-Content-Type. (Этот заголовок может быть вам не нужен - переменная MULTIPART_CTYPE, похоже, не отображалась в моем $_ENV, но новый заголовок сделал.) Все остальные запросы должны обрабатываться как обычно.

Благодаря Anti Veeranna для большей части этого!:)

EDIT: P.S. Очевидно, что это Apache-специфический, но в некоторых других конфигурациях PHP могут быть очень легкие способы.