Автор Тема: Чертова закачка  (Прочитано 5043 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Biggelow

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
Чертова закачка
« : 29 Сентября 2005, 14:43:42 »
Скрипт:

#!/usr/bin/perl

$SIG{ALRM} = sub { die "$0 timed out" };     # эти 2 строки не работают под
alarm 900;                                   # Windows, но они необязательны

use Fcntl;
use CGI qw(param);
use CGI       qw (:standard);                # читайте "perldoc CGI"
use CGI::Carp qw (fatalsToBrowser);          # вывод ошибок к browser-у

$CGI::POST_MAX = 1024*3; #3Кб

my $login = param (\'login\');
my $pass = param (\'pass\');

my $banner = param (\'banner\');
my $dir  = \'u:/home/www/banners\';

if($banner !~ /([\\w-]+ \\. (?: gif | jpe?g ))$/ix){


if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444)
{
print "Location: oshibka.shtml\\n\\n";
}
else{
binmode FILE;                              # включить binmode для Windows
print FILE while (<$banner>);                # и скопировать данные в файл
close FILE;

print "Location: go.cgi?login=$login&&pass=$pass\\n\\n";

}

}else{
print "Location: oshibka.shtml\\n\\n";
}

1. Я так понимаю в 3 Кб входит и логин с паролем. Как сделать чтобы они не учитывались.
2. Если файл больше 3 Кб скрипт вообще ошибку сразу дает и никакого oshibka.shtml.

Чего делать?

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Чертова закачка
« Ответ #1 : 29 Сентября 2005, 18:58:38 »
1. не передавать их методом POST ;)
2. напишите например так:
if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444 or $CGI::POST_MAX >1024*3 )
{
print "Location: oshibka.shtml\\n\\n";
}
else{
пока-пока. :)

Оффлайн Biggelow

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
Чертова закачка
« Ответ #2 : 30 Сентября 2005, 10:22:17 »
Что значит не методом POST?

Теперь стал закачивать все подряд по размеру gif и jpeg :(

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Чертова закачка
« Ответ #3 : 30 Сентября 2005, 11:26:56 »
значит, что, когда отправляется форма методом пост - она отправляется ВСЯ, т.е. и логин/пароль в том числе. все пришедшее и подпадает под конструкцию $CGI::POST_MAX = 1024*3; т.о. если Вы отправите свои логин/пароль скажем в урле (;) что, как Вы сами понимаете, крайне нежелательно), то эти значения не будут учитываться при вычислении длины запроса $CGI::POST_MAX. Можно сохранять логин пароль например во временный файл, а имя файла "отлавливать" скриптом через url_param,
тогда логин/пароль
Цитировать
Biggelow:
Я так понимаю в 3 Кб входит и логин с паролем. Как сделать чтобы они не учитывались.
не будут учитываться.

Цитировать
Biggelow:
Теперь стал закачивать все подряд по размеру gif и jpeg

исессна. считается хорошим тоном после редиректа выходить из скрипта. т.е. конструкция вида
Цитировать

print "Location: oshibka.shtml\\n\\n";

должна заканчиваться командой
exit;
у вас же получается, что вы отправили броузер на какую-то страницу, а скрипт продолжает себе работать. :)
===
;) надеюсь - понятно объяснила.
пока-пока. :)

Оффлайн Biggelow

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
Чертова закачка
« Ответ #4 : 30 Сентября 2005, 12:58:28 »
Переделал так:

#!/usr/bin/perl

$SIG{ALRM} = sub { die "$0 timed out" };     # эти 2 строки не работают под
alarm 900;                                   # Windows, но они необязательны

use Fcntl;
use CGI qw(param);
use CGI       qw (:standard);                # читайте "perldoc CGI"
use CGI::Carp qw (fatalsToBrowser);          # вывод ошибок к browser-у

my $login = param (\'login\');
my $pass = param (\'pass\');

my $banner = param (\'banner\');
my $dir  = \'u:/home/www/banners\';

$filename="3232ff.jpg";

if($banner !~ /([\\w-]+ \\. (?: gif | jpe?g ))$/ix){
print "Location: admin.cgi?action=addbanner&&login=$login&&pass=$pass&&nejpeg\\n\\n";
exit;
}
else{

$ddt=1024*3;
$CGI::POST_MAX = $ddt;


if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444 or $CGI::POST_MAX > $ddt)
{
print "Location: admin.cgi?action=addbanner&&login=$login&&pass=$pass&&estfileilirazmer\\n\\n";
exit;
}
else{
binmode FILE;                              # включить binmode для Windows
print FILE while (<$banner>);                # и скопировать данные в файл
close FILE;

print "Location: admin.cgi?action=addbanner&&login=$login&&pass=$pass\\n\\n";
exit;
}
}


Я Вас наверное уже достал, но все равно скрипт закачивает все подряд картинки.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Чертова закачка
« Ответ #5 : 30 Сентября 2005, 13:54:21 »
ну блин. ;) в вашем примере откуда, на ваш взгляд, берется $CGI::POST_MAX, которая сравнивается с $ddt? Должно-то оно браться из формы, отправленной методом пост.
а этот пример кода не работает с формой. :)
тогда уже натравите stat на свой $filename="3232ff.jpg"; и сравнивайте полученое значение в байтах с $ddt. но это ведь не то, чего вам хочется. верно?
каким-то образом нам нужно узнать размер файла до того, как мы его закачали.

if (not sysopen FILE, "$dir/$1", O_EXCL | O_CREAT | O_WRONLY, 0444 or $CGI::POST_MAX > $ddt) заменить на ее первоначальное состояние:
if (not sysopen FILE, "$DIR/$1", O_EXCL | O_CREAT | O_WRONLY, 0444)
это ошибочная конструкция была. ;)
 -- проблему того, что $CGI::POST_MAX "it will immediately exit with an error message" в той же документации предложено решать так:
$uploaded_file = param(\'upload\');
   if (!$uploaded_file && cgi_error()) {
      print header(-status=>cgi_error());
      exit 0;
   }
возможно еще кто-то поделится своими мыслями. :)
пока-пока. :)

Оффлайн Psixolog

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 23
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Чертова закачка
« Ответ #6 : 27 Октября 2005, 06:13:44 »
#!/usr/bin/perl 
$|=1;
use 
strict;
use 
CGI qw (param);
use 
Fcntl;

my $filename;
my $FL;
my $PATH;

$FL param("uploadfile");

# полный физ. путь к папке для загрузки файлов
# cо слешем / в конце.
# папка должна иметь права доступа "на запись" для всех пользователей.

$PATH "upload/";

print 
"Content-type: text/html\\n\\n";
print (\
'
<link href="images/style.css" rel="stylesheet" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">\');

if ($FL) 
{
	
$FL =~ /[\\\\\\/:]([^\\\\\\/:]+)$/;
	
$filename = $1;
	
open(DATA, ">".$PATH.$filename);
	
binmode (DATA);
	
print DATA while (<$FL>);
	
close (DATA);
print (\'<meta http-equiv="Refresh" content="1; URL=index.cgi?t=upload">\');
print (\'<table  width=40% bgcolor=#000000 border=0 cellpadding=1 cellspacing=1" align="center">
<tr><td class=e1 width=20%><font color="green" face="verdana" size="2">Файл успешно загружен!</b></font></td></tr>\');
print (\'
</table>
\');
}


Вот те ког ставь ограничения и всё!
http://holod.vip.su/cgi-bin/index.cgi - Класный сайт

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28