我花了一个小时试图让$ CGI :: POST_MAX在我写的脚本中工作。
我阅读了很多文档和示例,所有这些都不适用于我的案例。
首先让我们从下面的示例代码开始:
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw/:standard cookie/;
$CGI::POST_MAX= 1024 * 1024 * 2; # max 2MB
$CGI::DISABLE_UPLOADS = 1; # no uploads
use CGI::Carp qw(fatalsToBrowser);
my $q = CGI->new();
print "Content-type:text/html\n\n";
print "ERROR: $q->cgi_error()";
exit 0;
我需要(并且从上面的示例中可以清楚地看到)通过POST请求阻止加载超过2MB的任何数据并引发一个简单的标准错误(所有这些都是根据文档CGI.pm 4.40准确的)。
但这不起作用。无论我的移动电话$CGI::POST_MAX= 1024 * 1024 * 2;
和$CGI::DISABLE_UPLOADS = 1;
所有在我的完整代码,我是否更改任何值他们-什么都没有。该脚本传递任何数据(3,4和更多MB)。
如果我在CGI.pm的文档中检查字段:
此错误消息实际上由HTTP协议定义,旨在作为CGI脚本的状态代码返回到浏览器。例如:
my $uploaded_file = $q->param('upload');
if ( !$uploaded_file && $q->cgi_error() ) {
print $q->header( -status => $q->cgi_error() );
exit 0;
}
尝试发送大于$ POST_MAX字节的POST将导致param()返回空的CGI参数列表。
该字段包含有效的文件名,并且没有任何描述(所有字段必须为空,同时超出最大限制)。
我在Ubuntu 18.04上使用最新的Perl 5.26.1。CGI.pm是v.4.40,Apache 2.4.29。
我也尝试过CGI :: Safe,但没有运气。
如果你知道如何使它工作,我将感谢你的帮助!
发布于 2019-03-15 14:53:43
为此,我决定使用Apache 2.4核心指令LimitRequestBody
。它就像一个魅力。剩下的就是创建一个明亮的页面来覆盖它status 413
,它已准备就绪。
.htaccess有了新线(我的文件被称为用户,下面的例子使用FilesMatch匹配任何文件名,如用户目录中与相应的.htaccess):
<FilesMatch "user">
LimitRequestBody 1024
</FilesMatch>
它仅限于1024 bytes
(例如)。
并将完整的补救措施添加到.htaccess中:
RewriteEngine on
ErrorDocument 413 /cgi-bin/413.cgi
完成。
这种方法比使用Perl更有效,因为我们可以在服务器级别中断上传,这是一个好主意。
我希望它能帮助处理类似问题的其他人。
https://stackoverflow.com/questions/-100006454
复制相似问题