防止用户在perl中上传太大的文件

时间:2011-12-29 18:45:03

标签: perl buffer buffer-overflow

大家好我在perl脚本中有这行代码,我允许用户将5秒麦克风录音上传到我的服务器。执行录制的闪光灯会自动将麦克风限制为5秒,然后将录制内容发送到我的服务器。

 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

现在我的问题是,如果有人想要恶意,他们可以使用内部内存,带宽和可能的缓冲区溢出直接发布到我的服务器脚本。有没有办法防止有多少信息来自用户?

我在读取行之前尝试过这个,但我不完全确定这是正确的方法。有任何想法吗?感谢。

if ($ENV{'CONTENT_LENGTH'} > 100000) {
 #then return some error message / exit
}

编辑和解决我的问题:

 use CGI qw/:standard/;
 use CGI::Carp 'fatalsToBrowser';
 $CGI::POST_MAX=1024 * 100;  # max 100K posts
 #$CGI::DISABLE_UPLOADS = 1;  # no uploads

 $uploaded_file = param( 'POSTDATA' );
 if (!$uploaded_file && cgi_error()) {
  print header(-status=>cgi_error());
  exit 0;
 }

我要感谢你们所有人的快速回应(赞成所有人),但我必须给第一个发布正确链接的人提供正确答案,尽管他们没有努力写任何东西。我想这只是公平的吗?你们有什么想法,请在下面发表评论。

3 个答案:

答案 0 :(得分:3)

你说它是一个Perl脚本,但没有提到Perl CGI.pm模块。如果您使用该模块(我推荐),则对拒绝服务保护的支持有限。例如,您可以设置:

$CGI::POST_MAX = 100000;
如果出现任何过大的帖子,

和CGI.pm将退出您的脚本并显示错误。

在手册页中有一个decent discussion如何避免拒绝服务攻击。

答案 1 :(得分:2)

  

有没有办法阻止用户提供多少信息?

简单地说,没有。因为一旦它到达你控制中的东西(服务器),它就已经来自用户了。请参阅denial of service attack

这主要取决于滤除噪音的地方。例如:

  • 如果应用程序可以快速filter out bad requests,则不会占用不必要的处理资源。
  • 如果网络服务器可以过滤掉过大的请求,那么应用程序就不会受到打扰。
  • 如果路由器可以过滤掉过大的请求,服务器就不会受到打扰。
  • 如果ISP可以过滤掉来自已知恶意来源的请求,您的基础架构就不会受到他们的打扰。

真正恶意的用户可以提供足够严重的攻击,使您的服务器不再是问题。你的ISP的机架可以被软管。

答案 2 :(得分:1)