【问题标题】:Handling truncated POST data in php在 php 中处理截断的 POST 数据
【发布时间】:2021-09-17 03:01:31
【问题描述】:

我有一个包含少量(最多 10 个)输入的表单。其中一个输入是文件上传输入。表单布局如下:

<form method="post" ...>
<input type="hidden" name="input_no_1" value="value_no_1">
<input type="file" name="input_no_2">
<input type="hidden" name="input_no_3" value="value_no_3">
<button type="submit">send</button>

99.9% 的时间这个表单都可以正常工作,并且我在 PHP 端获得了所有数据。但是,每隔一段时间,POST 数据就会被截断,并且 $_POST 变量只包含以下内容:

input_no_1 => value_no_1

文件输入和文件输入后面的所有其他输入都丢失了。

此错误几乎只发生在包含“Mobile Safari”的用户代理中。我怀疑手机用户可能使用了不太可靠的网络连接,因此他们的请求被中止,PHP 没有收到全部上传的数据。

在我的应用程序中,我需要知道 $_POST 数组中的数据是否完整。我期待如果 HTTP 服务器没有收到整个请求,我什至不会从 PHP 端看到它。

我正在使用 apache/fpm。 upload_max_filesizepost_max_size 都设置为 2G,远不及上传文件的大小。

问题:在 PHP 中处理不完整的 POST 数据的最佳方法是什么?有没有办法阻止这些请求到达我的应用程序,如果没有,有没有办法知道发布的数据是否完整?我不想在表单末尾添加任何字段,只是为了了解请求是否完整:)

【问题讨论】:

  • 如果它表现得像你说的(文件输入之后的所有内容都丢失了),包括最后的“控制”输入实际上似乎是检测不完整有效负载的优雅解决方案。问题是,您可能总是需要向服务器发送一些东西,以检查您发送的内容(从客户端)和您收到的内容(在服务器中)。也许计算数据的哈希值并将其与您收到的内容进行比较,但您仍然必须实际发送它。

标签: php forms apache file-upload


【解决方案1】:

听起来这是需要一些服务器端表单验证的情况。假设上述字段都是必需的,那么以下内容可能对您有用:

if (!isset($_POST['input_no_1'], $_POST['input_no_2'], $_FILES['input_no_2'])) {
    die('Form not filled completely');
} else {
    //process form
}

【讨论】:

  • 问题是关于为什么我在 PHP 端得到一个不完整的有效负载以及如何检查有效负载作为一个整体是否完整。我无法单独检查每个字段,因为表单输入是由 javascript 动态生成的,并且服务器端脚本不知道必须存在哪些字段。
猜你喜欢
  • 1970-01-01
  • 2015-09-15
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多