【问题标题】:php behavior when post_max_size exceeded超过 post_max_size 时的 php 行为
【发布时间】:2011-11-01 17:19:11
【问题描述】:

我了解,如果 POST 请求超过 post_max_size,$_POST 和 $_FILES 超全局变量将变为空。

我已经看到很多关于如何检测这种情况的讨论,但从来没有解释过为什么超全局变量是空的。清除 POST 数据对我来说似乎很奇怪,迫使用户重新输入他们的答案。也许是一种安全预防措施?

对其他语言(java、.net)感到好奇。他们的行为是否相似?

谢谢

【问题讨论】:

  • 查看this question接受的答案
  • 看到图片与文本数据一起发送对我来说似乎很奇怪。
  • 甚至网络服务器本身也可能有限制,例如Apache's LimitRequestBody.
  • @ÁlvaroG.Vicario,感谢您的回复。幸运的是,LimitRequestBody 的默认值是无限制的,我在我们的服务器设置中验证了这一点。
  • @jbarreiros 如果你不明白为什么帖子数据会被丢弃,请阅读多部分 MIME 消息的工作原理,特别注意 multipart/form-data 类型.当到达post_max_size 时,服务器将停止接收和/或解析请求,并且不能保证文件数据后面没有更多“标准” POST 字段,因此 PHP 将把它全部丢弃,以防万一可能缺少的字段之一是至关重要的,缺少它的事实将导致您的应用程序对您的服务器进行意外更改。

标签: java php .net file-upload


【解决方案1】:

如果一个数组只能容纳 50 个索引,而你推入 100 个,你会期望其他 50 个保留在某个地方吗?

这同样适用于此设置。尽管可能有一些 POST 数据可以容纳最大大小,但拥有预期整体的一部分会导致比没有任何问题更多的问题。对吧?

检测空帖子比检测不完整的帖子要容易得多。

我相信这是他们的理由。

【讨论】:

    【解决方案2】:

    要回答您的第二个问题的一部分,使用 .NET,如果 POST 大于 maxRequestLength(.NET 配置的一部分),但小于 maxAllowedContentLength(IIS 配置的一部分),您可以createcustom HTTP module 以获取通过的 POST 部分。

    没有自定义 HTTP 模块,it'll just throw an exception。你希望maxRequestLength 成为限制因素,otherwise IIS will deal with it instead of .NET

    【讨论】:

      【解决方案3】:

      这是 PHP 代码的一个非常令人沮丧和奇怪的方面。有人说这是一个相当草率的设计,但是,嘿,这是一个很容易避免的问题——而且,如果有的话,它应该只是重申 UI 和数据传输设计的重要性。

      对于必然超过 ini 设置的表单(文件上传、大量文本等),我总是将内容异步上传到每天都会擦除的 tmp 目录。如果表单完成(现在删除了很多数据),文件将被转移到永久位置。

      您始终可以通过以下方式启动表单处理方法来检查是否出现问题:

      if(empty($_POST))
      {
        // show error to user
      }
      

      【讨论】:

        【解决方案4】:

        我不能代表实施者,但这样代码更简单。由于超全球是熟的,他们必须决定如何处理部分帖子,这不可避免地会导致许多人的困惑。还有以下替代方案:

        $data = file_get_contents('php://input');
        

        或者查看$HTTP_RAW_POST_DATA,虽然afaik,但这些都不适用于multipart/form-data

        【讨论】:

          猜你喜欢
          • 2011-01-09
          • 2011-09-10
          • 1970-01-01
          • 2011-12-06
          • 2023-01-19
          • 1970-01-01
          • 2011-08-06
          • 1970-01-01
          相关资源
          最近更新 更多