【发布时间】:2013-12-13 20:36:29
【问题描述】:
当连接缓慢的远程 Web 客户端无法发送带有 multipart/form-data 内容的完整 POST 请求但 PHP 仍使用部分接收的数据来填充 $_POST 数组时,我遇到了问题。因此,$_POST 数组中的一个值可能不完整,并且可能会丢失更多值。我首先尝试在Apache list 中提出相同的问题,并得到an answer Apache 不缓冲请求正文并将其作为
巨大的斑点。
这是我的示例 POST 请求:
POST /test.php HTTP/1.0
Connection: close
Content-Length: 10000
Content-Type: multipart/form-data; boundary=ABCDEF
--ABCDEF
Content-Disposition: form-data; name="a"
A
--ABCDEF
您可以看到 Content-Length 是 10000 字节,但我只发送了一个 var a=A。
PHP 脚本是:
<?php print_r($_REQUEST); ?>
Web 服务器等待我的其余请求大约 10 秒(但我不发送任何内容),然后返回此响应:
HTTP/1.1 200 OK
Date: Wed, 27 Nov 2013 19:42:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u3
Vary: Accept-Encoding
Content-Length: 23
Connection: close
Content-Type: text/html
Array
(
[a] => A
)
所以这是我的问题:如何在 PHP 中验证发布请求是否已完全收到? $_SERVER['CONTENT_LENGTH'] 会在请求头中显示 10000,但是有没有办法检查收到的真实内容长度?
【问题讨论】:
-
suhosin 会是你的答案吗? stackoverflow.com/a/8451656/1001641
-
@Naveed 来自Suhosin feature list 似乎他们只支持对变量名/值长度的限制,但这不是我需要的。我需要验证 Content-Length 是否与收到的真实消息正文的大小匹配。
-
远程客户端实际上是一个带有HTML页面的浏览器?
-
@MeNa 不,这是一个自定义应用程序,我可以对其进行修改。
标签: php apache post multipartform-data content-length