当post_max_size超过限制时,PHP的行为是什么?

6

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

我看到很多讨论如何检测这种情况,但从未解释为什么superglobals为空。对我来说,清除POST数据并迫使用户重新输入答案似乎非常奇怪。这可能是安全预防措施吗?

我想知道其他语言(Java、.NET)是否有类似的行为方式?

谢谢


7
请参见 这个问题的被接受答案 - Clive
我觉得在文本数据中发送图片真的很奇怪。 - Your Common Sense
即使是 Web 服务器本身也可能存在限制,例如 Apache 的 LimitRequestBody - Álvaro González
谢谢@Clive。我看了十几篇StackExchange的帖子,不知怎么错过了那个。 - jbarreiros
1
@ÁlvaroG.Vicario,感谢您的回复。幸运的是,LimitRequestBody的默认值是无限制的,我已经验证了我们服务器设置的情况。 - jbarreiros
4
如果您想了解为什么会丢弃帖子数据,请阅读有关多部分MIME消息的工作原理的相关内容,特别注意multipart/form-data类型。当达到post_max_size时,服务器将停止接收和/或解析请求,并且无法保证文件数据之后没有更多的“标准”POST字段,因此PHP将丢弃所有这些数据,以防其中一个潜在缺失的字段是至关重要的,而其缺失可能会导致应用程序对您的服务器进行意外更改。 - DaveRandom
4个回答

2
如果一个数组只能容纳50个索引,而你却推入了100个,你会期望另外的50个索引还在吗?
同样的道理也适用于这种设置。虽然可能有一些POST数据可以适应最大大小,但是只有预期整体的一部分会比根本没有带来更多问题。 对吧?
检测空白的POST要比检测不完整的POST简单得多。
我相信这是他们的理由。

1

回答你第二个问题的一部分,使用.NET,如果POST大于maxRequestLength(这是.NET配置的一部分),但小于maxAllowedContentLength(这是IIS配置的一部分),你可以创建一个自定义HTTP模块来获取传输的POST的一部分。

没有自定义HTTP模块,它会抛出异常。并且你希望maxRequestLength成为限制因素,否则IIS将处理它而不是.NET


0

我不能代表实现者发言,但是这种方式代码更简单。由于超全局变量已经被处理过了,他们必须要做出关于如何处理部分提交的决策,这将不可避免地导致许多人的困惑。还有其他的选择:

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

或者查看$HTTP_RAW_POST_DATA,尽管据我所知,这两个都无法使用multipart/form-data


0

这是PHP代码中一个真正令人沮丧和奇怪的方面。有些人说这是非常糟糕的设计,但嘿,这是一个可以很容易避免的问题 - 而且,如果有什么问题的话,它只会进一步证实UI和数据传输设计的重要性。

对于那些可能超出ini设置(文件上传、大量文本等)的表单,我总是将其异步上传到每天清空的临时目录中。如果表单完成(现在已剥离了很多数据),则将文件转移到永久位置。

您始终可以通过在表单处理方法中添加类似以下内容来检查是否出现问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接