Запретить пользователю загружать слишком большой файл в Perl - PullRequest
2 голосов
/ 29 декабря 2011

Привет, ребята, у меня есть эта строка кода в 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 ]

3 голосов
/ 29 декабря 2011

Вы говорите, что это скрипт Perl, но не упоминаете модуль Perl CGI.pm .Если вы используете этот модуль (который я рекомендую), существует некоторая ограниченная поддержка защиты от отказа в обслуживании.Например, вы можете установить:

$CGI::POST_MAX = 100000;

и CGI.pm выйдет из вашего скрипта с ошибкой, если появятся слишком большие сообщения.

Приличное обсуждение о том, как избежать атак типа "отказ в обслуживании" на странице руководства.

2 голосов
/ 29 декабря 2011

Есть ли способ предотвратить, сколько информации поступает от пользователя?

Если говорить просто, нет.Потому что, как только он попадает к чему-то под вашим контролем (серверу), он уже получен от пользователя.См. атака отказа в обслуживании .

В основном это вопрос того, где вы отфильтровываете шум.Например:

  • Если приложение может быстро отфильтровать неверные запросы , они не будут занимать ненужные ресурсы обработки.
  • Если веб-сервер может фильтроватьЕсли запросы слишком велики, приложение не будет их беспокоить.
  • Если маршрутизатор может отфильтровывать слишком большие запросы, сервер не будет их обрабатывать.
  • Если интернет-провайдер может отфильтровывать запросы из известных вредоносных источников, ваша инфраструктура не будет их беспокоить.

Действительно злонамеренный пользователь может провести достаточно серьезную атаку, чтобы ваш сервер даже не былвыпускать большеСтойка у вашего провайдера может быть шлангом.

1 голос
/ 29 декабря 2011
...