如何防止警告:POST Content-Length 和内存大小

Posted

技术标签:

【中文标题】如何防止警告:POST Content-Length 和内存大小【英文标题】:How to prevent Warning: POST Content-Length and memory size 【发布时间】:2014-03-09 10:05:51 【问题描述】:

目前,当用户上传照片时,页面显示“警告:XXX 字节的 POST Content-Length 超过第 0 行未知中 21000000 字节的限制”。

我知道这意味着什么,我不是在寻找诸如增加 max_upload 值甚至 memory_size_limit 之类的解决方案...因为即使您明确告诉用户,用户也可能上传 TB 的废话它们最多只能有 20MB 的文件,并且只允许使用图像。

我正在寻找解决方案:

如何防止这种警告发生? 或者至少: 如何防止显示此警告?

编辑:请阅读! - 请理解我当然在处理错误/警告(从第 1 行开始),问题是 这发生在虚拟“第 0 行” 这就是我需要的原因隐藏错误或防止它引发 - 因为我不能在错误发生的地方之前放置任何代码。

EDIT2:经过长时间的研究和挖掘,我终于有了一个想法——它奏效了——看看我自己的答案。

【问题讨论】:

不显示错误意味着不是解决问题而是通过它。我不鼓励它。您可以在上传之前检查文件的大小(在现代浏览器上 - html5 File API),请查看:***.com/a/11514290/998096 如果用户发送的请求过大,他们可能而且应该被您的Web 服务器拒绝,而不是因为内存耗尽而隐藏错误。但是,如果您不是在寻找如何正确操作的解决方案,那么为什么还要费心隐藏消息呢? @OfirBaruch 我知道,但总会有人绕过客户端检查我正在寻找服务器端解决方案 @N.B.我需要捕获 php 中的错误以告诉用户“嘿,你上传的内容太多了”,但问题是这发生在脚本之前......那么你有什么解决方案吗? 当你提出这样的问题时,*** 上的每个人都会立即假设你做错了什么,这很有趣。可悲的是,在许多情况下,这些人可能是正确的。但在这种情况下,那些人应该已经意识到 HTTP 请求的基本规则在这里适用:你永远不能相信浏览器/客户端发送给你的内容。 【参考方案1】:

所以在搜索而不是今天工作之后,我终于知道如何解决这个问题,它奏效了,甚至没有造成太大的损害。但请先了解你在做什么,然后再做。 :) 正如我在我的一个 cmets 中所建议的,确实可以关闭 .htacess 中的 PHP 错误 - 只需关闭 PHP 启动警告即可。

在应用解决方案之前:

请注意:将此代码插入 .htaccess 后,您将无法看到 任何 启动错误

另请注意:第“0”行的启动错误比这一行多。

之前做:在您执行此操作之前,您应该准备好您的脚本,以检查上传的内容大小并向用户提供适当的信息消息。警告没有显示 DOES NOT 的事实意味着您不应该对此采取任何措施。这意味着完全相反 - 您应该尽一切可能使某些事情至少接近警告引发 - 检查,如果可以,请仔细检查,处理错误并引发您自己的错误消息。

将此添加到您的 .htaccess:

php_flag display_startup_errors off

看起来并不那么邪恶:

请注意,这会关闭启动错误。 所以所有常规 PHP 错误/警告/通知都保持打开状态 :)

甚至 XAMPP 的 PHP“本身”也推荐它用于生产:

php.ini 文件字面意思是:

; display_startup_errors
;   Default Value: Off
;   Development Value: On
;   Production Value: Off

PS:“启动错误”似乎是那​​些 PHP 脚本本身执行之前的错误 - 这些错误通常试图“说服”你 他们在第 0 行

感谢我的想法和这个答案:How to disable notice and warning in PHP within .htaccess file?

编辑:因为这是一个 php_flag 设置,你当然也可以在你的 php.ini 中默认设置它,如果你有 PHP 的自定义安装:)

【讨论】:

【参考方案2】:

问题是

如何防止警告:POST Content-Length

答案是,不编辑任何配置值,将此代码放在将接收要处理的表单的文件的开头:

 <?php // here start your php file
 ob_get_contents();
 ob_end_clean();

就是这样。没有更多警告,以及您不希望在页面上输出的任何其他内容。 之后,按照其他地方的建议,您可以决定如何处理:

if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0) echo"WoW your file is too big!"; 

如果您以另一种方式传递有关要由 Php 处理的文件的正确值,也可以将文件分块。

这里解释Warning: POST Content-Lenght ...

【讨论】:

【参考方案3】:

我遇到了类似的问题,想知道您是否找到了满意的解决方案。目前,我的“PHP 警告:21010354 字节的 POST 内容长度超过了 8388608 的限制”在日志中,我认为对此我无能为力。

我在 Zend 框架中工作,当用户像上面那样上传文件时,它基本上会终止所有通常的 POST 数据解析,因此对 getParams() 的响应不包含任何通常的 POST 参数。这意味着用户收到验证错误,说其中一个字段丢失,这是一种误导。

在对此进行研究时,我发现了一些您可能想要查看的有趣 php_ini 设置,特别是 enable_post_data_reading 和 always_populate_raw_post_data。就我而言,我正在上传一个 20M 的文件,最大的帖子为 8M,上传的文件最大为 10M,即使发布数据现在为空, php://input 的结果似乎是一个完整的 20M 文件.

因此,我将手动检查原始数据是否超出限制,如果超出限制,则假设一切都失败(并保释)。我建议您可以编写自己的代码来解析原始数据,以填充 $_POST 数据。然后,您可以根据需要启动代码,并且只有在您准备好时,检查用户上传的数据是否超过限制。这取决于你,然后在解析它之前返回一个错误,或者如果它没问题,解析它。只要您将 PHP 发布和上传限制设置为高于您的用户限制,它就应该允许用户违反规则,允许您的代码检测到后膛并抱怨它。

【讨论】:

【参考方案4】:

这是正确防止此错误的真正解决方案。

在你的 php.ini 中设置这个参数:

enable_post_data_reading = On
upload_max_size=0
post_max_size=0

警告:请确保在您的表单中包含此行

<input type="hidden" name="MAX_FILE_SIZE" value="2048576" />

还有最重要的:

一定要检查$_FILES['file']['error']的代码错误

一定要在 PHP 中检查上传的大小

【讨论】:

您能解释一下这将如何安全地工作吗?因为enable_post_data_reading 默认开启(关闭意味着不会填充 $_POST 和 $_FILES)并且将后一个 2 设置为 0 将完全关闭 server-layer-limit 所以你基本上允许放入进程文件任何尺寸...【参考方案5】:

正如您已经发现的那样,在 PHP 中是不可能的,因为 PHP 只能从第 1 行开始捕获错误。

唯一的解决办法是在 PHP 源代码中挖掘,找到引发错误的位置,然后在编译你的服装 php 版本之前从 PHP 源中删除该部分。

但请注意,抛出错误消息是有原因的。

【讨论】:

好吧,我相信这会有所帮助。但这是一个警告,总的来说 - 所有常见的 PHP 错误都不值得重新编译 PHP...我个人知道只有一种类型的错误值得考虑重新编译整个 PHP...而且它不是任何常见的错误错误/警告/通知 :)【参考方案6】:

为防止发生此错误,您必须在之前检查上传文件的大小,如果文件太大,您必须取消上传!

为了不显示它们,我认为如果你写在你的 php 脚本中就足够了

error_reporting(0);

【讨论】:

这既不是 OP 所要求的,也不是实际工作的。启动错误永远不能通过代码隐藏(因为它们是在任何代码运行之前抛出的)。【参考方案7】:

1.你可以在上传前用javascript检查文件大小,但这可能会被篡改!

2.上传后保存文件前检查文件大小。

<?php

$size = filesize($uploaded_file);
if($size > $your_size_limit)

    echo "Throw bunch of errors";

else

    //save it

?>

3.不要试图隐藏错误来解决问题。

【讨论】:

4) 您实际上可以使用 Web 服务器,那些已经开发了数十年的漂亮的闪亮的东西,并且拒绝迟钝的大请求进入 php 方面。 这是一个警告。不是错误(但很抱歉我先写了这个错字,所以我可能把你弄糊涂了)。我通常不这样做,但在这种情况下,没有办法阻止它(除了重新编译 PHP)。所以隐藏起来,自己解决问题似乎更好。 它不能像你说的那样检查。

以上是关于如何防止警告:POST Content-Length 和内存大小的主要内容,如果未能解决你的问题,请参考以下文章

如何防止警告:POST Content-Length 和内存大小

如何防止警告:POST Content-Length 和内存大小

如何防止 Visual Studio 警告缺少调试信息?

如何防止自动生成评论只是为了快速修复 serialVersionUID 警告?

我们如何防止警告在其消息末尾打印奇怪的文本? [复制]

如何防止 Vetur 和 TypeScript 在 VSCode 中同时显示打字稿警告?