获取原始帖子数据

时间:2009-09-01 10:18:25

标签: php request

根据php手册,也没有php://输入$HTTP_RAW_POST_DATA并不能处理multipart/form-data POST请求。

“php:// input允许您读取原始POST数据。它是$HTTP_RAW_POST_DATA的内存密集型替代品,不需要任何特殊的php.ini指令.php://输入不可用enctype="multipart/form-data"“。

如何获取multipart/form-data表单的原始数据?

3 个答案:

答案 0 :(得分:36)

直接回答:你做不到。只要PHP看到multipart / form-data Content-Type,它就会坚持自己解析它。原始数据将无法使用。可悲的是。但你可以破解它。

我遇到了类似的问题,合作伙伴发送格式不正确的数据作为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从multipart / form-data更改为XXX.php到multipart / form-data-alternate,这足以阻止PHP尝试解析它

在此之后,您最终可以从php://输入读取整个原始数据并自行解析。

这很丑陋,但我没有找到更好或实际上任何其他解决方案 - 没有要求合作伙伴解决他们的问题。

NB!当你按照我在这里描述的那样做时,$ _FILES将为空。

答案 1 :(得分:11)

您可以设置enable_post_data_reading = Off,PHP不会拦截multipart/form-data数据。

要求: PHP 5.4

答案 2 :(得分:5)

我没有完全实现它,但它看起来应该可行。在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解析正文的原始问题,并且问题 Norbert Farkas 报告:“Apache发回PHP源代码“。然后可以在php://input上使用正文,并在X-Real-Content-Type标题中使用实际内容类型。 (那个标题可能不是必需的 - MULTIPART_CTYPE变量似乎没有显示在我的$_ENV中,但新标题确实出现了。)所有其他请求应该像往常一样处理。

感谢 Anti Veeranna 的大部分内容! :)

编辑:P.S。显然它是特定于Apache的,但在PHP的其他一些配置中,可能有更简单的方法。