获取原始帖子数据

2022-08-30 14:15:54

根据php手册和 php://input 两者都不适用于POST请求。$HTTP_RAW_POST_DATAmultipart/form-data

“php://input 允许您读取原始 POST 数据。它是一种较少占用内存的替代方案,不需要任何特殊的php.ini指令。php://input 不适用于 。”$HTTP_RAW_POST_DATAenctype="multipart/form-data"

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


答案 1

直接回答:你不能那样做。PHP坚持自己解析它,每当它看到多部分/表单数据内容类型。原始数据将不可用。可悲的是。但是你可以绕过它。

我遇到了类似的问题,一个合作伙伴将格式不正确的数据作为多部分/表单数据发送,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> 

这会将传入请求的内容类型更改为 XXX.php从多部分/表单数据更改为多部分/表单数据替代,这足以阻止 PHP 尝试解析它

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

这很丑陋,但我还没有找到更好的解决方案,或者实际上任何其他解决方案-除了要求伴侣修复他们的一面。

铌!当你按照我在这里描述的去做时,_FILES美元将是空的。


答案 2

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

需求: PHP 5.4


推荐