我了解如果POST请求超过post_max_size,$_POST和$_FILES超全局变量将变为空。
我看到很多讨论如何检测这种情况,但从未解释为什么superglobals为空。对我来说,清除POST数据并迫使用户重新输入答案似乎非常奇怪。这可能是安全预防措施吗?
我想知道其他语言(Java、.NET)是否有类似的行为方式?
谢谢
我了解如果POST请求超过post_max_size,$_POST和$_FILES超全局变量将变为空。
我看到很多讨论如何检测这种情况,但从未解释为什么superglobals为空。对我来说,清除POST数据并迫使用户重新输入答案似乎非常奇怪。这可能是安全预防措施吗?
我想知道其他语言(Java、.NET)是否有类似的行为方式?
谢谢
回答你第二个问题的一部分,使用.NET,如果POST
大于maxRequestLength
(这是.NET配置的一部分),但小于maxAllowedContentLength
(这是IIS配置的一部分),你可以创建一个自定义HTTP模块来获取传输的POST
的一部分。
没有自定义HTTP模块,它会抛出异常。并且你希望maxRequestLength
成为限制因素,否则IIS将处理它而不是.NET。
我不能代表实现者发言,但是这种方式代码更简单。由于超全局变量已经被处理过了,他们必须要做出关于如何处理部分提交的决策,这将不可避免地导致许多人的困惑。还有其他的选择:
$data = file_get_contents('php://input');
或者查看$HTTP_RAW_POST_DATA
,尽管据我所知,这两个都无法使用multipart/form-data
。
这是PHP代码中一个真正令人沮丧和奇怪的方面。有些人说这是非常糟糕的设计,但嘿,这是一个可以很容易避免的问题 - 而且,如果有什么问题的话,它只会进一步证实UI和数据传输设计的重要性。
对于那些可能超出ini设置(文件上传、大量文本等)的表单,我总是将其异步上传到每天清空的临时目录中。如果表单完成(现在已剥离了很多数据),则将文件转移到永久位置。
您始终可以通过在表单处理方法中添加类似以下内容来检查是否出现问题:
if(empty($_POST))
{
// show error to user
}
multipart/form-data
类型。当达到post_max_size
时,服务器将停止接收和/或解析请求,并且无法保证文件数据之后没有更多的“标准”POST字段,因此PHP将丢弃所有这些数据,以防其中一个潜在缺失的字段是至关重要的,而其缺失可能会导致应用程序对您的服务器进行意外更改。 - DaveRandom