Forum Webscript.Ru

Программирование => Perl => Тема начата: Frodo от 01 Августа 2002, 02:02:22

Название: Немного вопросов и отладка..:)
Отправлено: Frodo от 01 Августа 2002, 02:02:22
Надеюсь сильно пинать не будете? :) Вот написал скриптик маленький, хочется исправить пару недочетов, ну и сами посмотрите может чего добавить? :) Это пока токо администрирование, сам скрипт приема голосов выложу чуть позже...:)
Для его успешной работы хватит лишь положить в папку cgi-bin, и добавить папку data. Ну и ессесно прописать ХТМЛ адресс.

1.При авторизации, если оставить поле "пароль" пустым, и отправить запрос, выдает ошибку. В чем дело?
2.Проблема с куками, в начале каждой функции приходится вставлять "print header(-charset=>\'windows-1251\')". Можно ли как-нибудь это дело исправить?
3.Можно даже ко 2-му отнести, опять куки и хидер, если куки уже установлены, и заходить с начала скрипта(авторизация). Происходит редирект на главный раздел, но там уже стоит хидер, и перед самой таблицей выходит надпись print header(-charset=>\'windows-1251\')...
4.Может у кого-нибудь есть какие-нибудь предложения о безопасности скрипта, а то вставлять проверку на куки в каждой функции - изврат :)
----
#!/usr/bin/perl -w
####################################
#by Frodo[mW] | frodo@hotbox.ru    #
####################################
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:all);

my $pass="68qsa";                            # Пароль для доступа к Администрированию.
my $url="http://mindworx.com/cgi-bin/v";     # Адресс сайта и путь к скрипту, НЕ ставте в конце слэш!

my($data,$ras,$full,$cook) =("./data",".dat","full.cat");

if (!param)                                         {&ident;}
elsif (param(\'passw\'))                              {&checkpass;}
elsif (param(\'action\') eq "new")                    {&new;}
elsif (param(\'id\'))                                 {&createfile;}
elsif (param(\'action\') eq "red")                    {&read;}
elsif (param(\'file\'))                               {&readfile;}
elsif (param(\'add\'))                                {&add;}
elsif (param(\'kod\'))                                {&kod;}
elsif (param(\'dlinagrafa\') && param(\'sirinagrafa\') && param(\'knopka\')) {&save;}

sub ident {
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){&work;}
else{
print header(-charset=>\'windows-1251\');
print <




Vote by [mW]
Пожалуйста пройдите авторизацию, для администрирования
        голосованием.
(Обязательно должны быть включены cookie).


       
       
       
       
       
Введите пароль:_____



EOF
}}

sub checkpass {
if ($pass ne param(\'passw\')){&ident;}
else {
$cook=cookie(-name => "mwvote",
             -value => "$pass",
             -expires => "+1h");
print header(-cookie => $cook,
             -charset=>\'windows-1251\');
&work;
}}

sub work{
print header(-charset=>\'windows-1251\');
print <







Создание, Редактирование и Удаление Голосований.


EOF
}

sub new{
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
print header(-charset=>\'windows-1251\');
print <





Создание Голосования.


          Название файла должно состоять только из латинских букв, цифр, символов
          подчеркивания и не должно превышать 20 знаков!
Введите название файла!

EOF
}
else{&off;}
}

sub createfile{
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
print header(-charset=>\'windows-1251\');
my $file=param(\'id\');
if(-e "$data/$file$ras"){err(1);}
elsif(!($file=~ /^[a-z0-9_]+$/)){err(2);}
elsif(length($file)>20){err(3);}
else{
my @add2file;

open (FILE, ">>$data/$full") || die "Ошибка при записи файла: $!";
print FILE "$file\\n";
close FILE;

$add2file[0]="100\\n";
$add2file[1]="8\\n";
$add2file[2]="Ответить\\n";
$add2file[3]="yes\\n";
$add2file[4]="yes\\n";
$add2file[5]="Что вы думаете об этом скрипте ?\\n";
$add2file[6]="Хорош=0\\n";
$add2file[7]="Можно и лучше..=0\\n";

open (FILE, ">$data/$file$ras") || die "Ошибка при записи файла: $!";
print FILE @add2file;
close FILE;

print <



EOF
}}
else{
print header(-charset=>\'windows-1251\');
print "Пройдите авторизацию!\\n";
}}

sub read{
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
print header(-charset=>\'windows-1251\');
my (@file,$file);

open FILE,"$data/$full";
@file=;
close FILE;

print <



EOF
foreach $file(@file) {
print <

EOF
}
print <
Выберите голосование для его последующего редактирования
Файл:

HTML
}
else{&off;}
}

sub readfile {
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
print header(-charset=>\'windows-1251\');
my ($file,@file,$i,$long,$tfile,$check,$check2);
$file=param(\'file\');
if(!($file=~ /^[a-z0-9_]+$/)){err(2);}
else{
$tfile="$file$ras";

open (FILE, "$data/$tfile") || die "Ошибка при открытии файла: $!";
@file=; chomp @file;
close FILE;
$long=$#file;
if ($file[3] eq "yes"){$check="checked";}
if ($file[4] eq "yes"){$check2="checked";}

print <











EOF

for ($i=6; $i<=$long; $i++) {
my($q,$a)=split(/=/,$file[$i]);
print <

EOF
}
print <
Редактирование фала голосования.

Для удаления ответа, поставте галочку.
Код Голосования                Назад
                         Логи
Длинна графика.
Ширина Графика.
Надпись на кнопке.
Разрешить повторное голосование?
Показывать результаты голосования?
Вопрос.
Ответ.




EOF
}}
else{&off;}
}
Название: Часть ДВА! :)
Отправлено: Frodo от 01 Августа 2002, 02:03:11
sub add {
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
my($file,@file,$long,$tfile);
$file=param(\'add\');
if(!($file=~ /^[a-z0-9_]+$/)){err(2);}
else{
$tfile="$file$ras";

open FILE,"$data/$tfile";
@file=;chomp @file;$long=$#file;
close FILE;

open (FILE, ">>$data/$tfile") || die "Ошибка при записи файла: $!";
print FILE $file[$long+=1]="Новый Вариант=0\\n";
close FILE;
print header(-charset=>\'windows-1251\');
print <



EOF
}}
else{&off;}
}

sub save {
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
my ($long,$file,@file,$i,@temp,$temp,$tfile);
$long=param(\'hidmax\');
$file=param(\'hidfile\');
if(!($file=~ /^[a-z0-9_]+$/)){err(2);}
else{
@temp=param(\'del-row\');
$tfile=$file.$ras;
print header(-charset=>\'windows-1251\');

$file[0]=param(\'dlinagrafa\')."\\n";
$file[1]=param(\'sirinagrafa\')."\\n";
$file[2]=param(\'knopka\')."\\n";
if (param(\'ip\') and param(\'ip\') eq "yes"){$file[3]="yes\\n";} else{$file[3]="no\\n";}
if (param(\'show\') and param(\'show\') eq "yes"){$file[4]="yes\\n";} else{$file[4]="no\\n";}
$file[5]=param(\'vopros\')."\\n";

for ($i=6; $i <= $long; $i++){
$file[$i]=param("$i")."=".param("row$i")."\\n";
}
foreach $temp(@temp){
$file[$temp]=();
}

open (FILE, ">$data/$tfile") || die "Ошибка при записи файла: $!";
print FILE @file;
close FILE;
print <



EOF
}}
else{&off;}
}

sub kod{
if(cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')){
my ($text,$lng,$tfile,$file,@file,$i);
my $t=0;
$file=param(\'kod\');
if(!($file=~ /^[a-z0-9_]+$/)){err(2);}
else{
$lng=param(\'max\');
$tfile=$file.$ras;
open (FILE, "$data/$tfile") || die "Ошибка при открытии файла: $!";
@file=; chomp @file;
close FILE;
print header(-charset=>\'windows-1251\');

print <





Код голосования

1.HTML код голосования.




2.Если ваш сервер поддерживает SSI, то вы можете вставить следующий код.




Результаты голосования

1.HTML код голосования.




2.Если ваш сервер поддерживает SSI, то вы можете вставить следующий код.






EOF
}}
else{&off;}
}

sub off{
print header(-charset=>\'windows-1251\');
print <

Пройдите авторизацию!


EOF
}
sub err{
if($_[0] == 1){
print <

Такой файл уже существует!


EOF
}
elsif($_[0] == 2){
print <

Недопустимые символы в названии файла!


EOF
}
elsif($_[0] == 3){
print <

Длинна файла превышает 20 символов!


EOF
}
}
Название: Немного вопросов и отладка..:)
Отправлено: Tankist от 01 Августа 2002, 02:14:10
Блин хватит может форум засорять?:abuse:
Я б за такое тему удалял и автора в бан пожизненно!:abuse:
Название: Немного вопросов и отладка..:)
Отправлено: Tankist от 01 Августа 2002, 02:15:43
Цитировать
выложу чуть позже...:)

Ой не пугай!:)
Название: Немного вопросов и отладка..:)
Отправлено: Frodo от 01 Августа 2002, 02:36:18
Cтранный ты какой-то, форум-то для чего? :) где я еще скрипт тюнинговать буду?

он кстати меньше будет, раз этак в 5..:)
Название: Немного вопросов и отладка..:)
Отправлено: Tankist от 01 Августа 2002, 03:01:41
Форум для того чтобы: ты спрашиваешь - тебе отвечают, а не для того чтобы тут листинги устраивать...
Не работает отдельный кусок кода - покажи его и все с раздостью ответят...
Название: Немного вопросов и отладка..:)
Отправлено: glebushka от 01 Августа 2002, 03:12:43
Frodo
1. разбирайся сам, могу только сказать что ругается сервер на 14 строчку, т.е. на:
if (!param) {&ident;}
Говоря следующее:
"Use of uninitialized value in string"
Причём повотряет это дважды, наверное для непонятливых:-), после чего выдёт 500 ошибочку.
Сразу сказать что не правильно я не могу, но что-то явно здесь не так:-)
2. Проблем никаких нет, просто перед тем как передавать браузеру информацию, ты должен ему сообщить, что именно передаёшь, а в некоторых случаях ты направно сделал заголовок, в функции work, убери заголовок, он не нужен (после проверки куков ты и так его сделал, а так сейчас этот заголовок выводитися в ХТМЛ файл.
3. см второй:-), вот правда редиректа у меня не происходит;)
4. для того чтобы немного ускорить процесс авторизации гораздо проще создать файл в котором будет указано:
1) IP посетителя, который авторизировался
2) время до которого действует эта запись, если + 1 час, так прибавляешь один час, если больше то больше и постоянно сравниваешь с текущим временем.
На самом деле это (по идеи) работает быстрее куков, хоть и выглядит сложнее, т.к. не происходит передачи данных: запроса сервера и ответа браузера, на эту передачу, естественно уходит время. Всё это конечно ИМХО.
Мне этот вариант нравиться ещё и потому, что тогда не важно, разрешены ли в браузере куки или нет.
Для меня сложнее всего было прибавлять время:-). Ведь если просто прибавлять по часу, то когда мы прибавим к 23.30 + 1 час получим 24.30, понятно что тогда этот IP будект сохранён в файле на веки вечные (проверка по дате тоже не катит, ну думаю поймёшь почему. Так воть после долгих моих мучений с датами:-), я догадался подсмотреть у Штайна (дяденька который модуль CGI написал).
Если тебе нужно скачай мой любимый модуль:-) я там его урезал специально для тебя до одной функции определения времени. Называется модуль не за что не догадаешься:-)glebushka.pm. Качаем по адресу: http://www.glebushka.hut.ru/glebushka.pm
Размести его в каталоге со скриптом, и подключи require "glebushka.pm";
После чего обращаешься к функции, следующим образом:
my $time=&glebushka_vrema("+1h", "chislo");
для того чтобы получить текущее время вместо 1h пиши 1s (!). Обязательно передавай первый параметр, а то плохо будет.
В принципе в комментариях к модулю это есть. Если какие проблемы и/или рац.предложения по этой функции определения времени пиши мне на мыло. (stalnoy_gleb@mail.ru).
5. всё-таки ты это, не выкладывай такие большие фрагменты кода в форуме, неудобно, лучше кидай урл для скачки.
Название: Немного вопросов и отладка..:)
Отправлено: glebushka от 01 Августа 2002, 03:20:38
Tankist
Frodo
контакт!:-). Записался я...
2Tankist, ну зачем же сразу банить? Злой ты какой-то сегодня:-).  Действительно в таких случаях урлы кидают для скачивания ну или приводят неработающий кусок кода.
2Frodo см. выше:-). Если у тебя нет своего сайта, то хороший повод сделать хоумпагу, ну туда и выкладывать для скачивания подобные вещи.
Название: Немного вопросов и отладка..:)
Отправлено: Unregistered от 01 Августа 2002, 03:30:27
1. Да я сам знаю, думаешь я логи не смотрел, просто не могу понять, по идеи если не давать параметров(пароля) param(\'passw\') является ложью, и тогда в той строке обсурд...хотя хз...%)
2.Правильно, но если с установленными куками зайти по htp://...admin.cgi тебя редиректит с &indef на &work, и тогда браузер не понимает какой формат мы ему даем и выдает 500 ошибку..:)
3.Зна кукисы не поставились..:( или попробуй зайди на скрипт ьез параметров и нажми рефреш, может кеширование...
4.О! хорошая идея, чедня после полудня опробую..:) Спасибки хоть что-то рациональное...
5. Ну..ээ...ладно...так уж и быть..:)
6.Спасиб еще раз, вот ток не расписывай так, а то прям книжка для чайников..:)
Название: Немного вопросов и отладка..:)
Отправлено: Frodo от 01 Августа 2002, 03:31:18
Куда записался?
Название: Немного вопросов и отладка..:)
Отправлено: Frodo от 01 Августа 2002, 03:33:01
2Tankist
У мя все работает мне оттюнинговать просто надо..:)
Название: Немного вопросов и отладка..:)
Отправлено: Unregistered от 01 Августа 2002, 03:36:38
2glebushka
Да не, мы скоро домен mindworx.com купим, я веб-дизайном занимаюсь, точнее программированием, вот приспичило скрипт написать, а то все остальные не доработанные, запомнил ссылку сменил урл и пжалуйста ты в админской части..:(
А дорабатывать чужой, труднее чем написать свой..:)
Название: Немного вопросов и отладка..:)
Отправлено: glebushka от 01 Августа 2002, 04:11:32
Цитировать
Куда записался?

не в том смысле:-), а в смысле "задумался", только не думал а печатал:-))), ну надеюсь ты меня понял:-))).
Цитировать
редиректит с &indef на &work, и тогда браузер не понимает какой формат

А... Тады не нужен заголовок в функции checkpass
"-charset=>\'windows-1251\');"
Воть... А то сначала заголовок когда куки устанавливаешь, потом в indef.
Frodo, ты бы зарегистрировался что ли... А то всё время под разными именами:-).
Цитировать
А дорабатывать чужой, труднее чем написать свой.

Это точно... Хотя изучая чужие (например какадувовские) можно найти много чего полезного.
Название: Немного вопросов и отладка..:)
Отправлено: Frodo[mW] от 01 Августа 2002, 04:19:45
Терь понял..:)

Если я из чекпаса уберу хидер, куки не запишутся...вроде...:(

Да я зарегился..:) давно...пароль просто забыл..:)

Я когда этот писал, посмотрел скриптов пять, именно по голосованию..чего токо не насмотрелся...от меток и go_to до шифрования пароля на админский скрипт, но с свободным заходом при параметрах..:)
Название: Немного вопросов и отладка..:)
Отправлено: glebushka от 01 Августа 2002, 04:48:30
Цитировать
Если я из чекпаса уберу хидер, куки не запишутся...вроде...

Угу. точно. ступил я :-).
Вообщем сделай так, чтобы заголовки два раза не повторялись, например в  &indef перед запуском &work поставь заголовок, а из &work убери.
Название: Немного вопросов и отладка..:)
Отправлено: Frodo[mW] от 01 Августа 2002, 04:52:45
А низя в одном месте их задать и усе..? :)
Кста может чего еще добавить (удаление и выход само собой, эт легко и почти готово, в черновом варианте..:)
Дизайн как? :) ну там выскажись по скрипту..:)
Название: Немного вопросов и отладка..:)
Отправлено: glebushka от 01 Августа 2002, 10:47:34
Цитировать
А низя в одном месте их задать и усе..?

Теоретически всё можно:-) Вот только структуру программы придётся поменять.
Цитировать
удаление и выход само собой, эт легко и почти готово, в черновом варианте..

Да ты ещё и выход-то не сделал:-). Где обработка action=exit? Напиши хотя бы досвидания чтоли... А удаление и выход ИМХО лучше не совмещать. Может кому надо будет удалить сразу несколько голосований, ну или послеудаления добавить.
Цитировать
Дизайн как?  ну там выскажись по скрипту..

Да вообще в админ интерфейсе с дизайном заморачиваться не стоит, а так вроде всё ок. Доделай до конца скрипт, тогда и поговорим.
ЗЫ. а что это за конструкция:
cookie(\'mwvote\') and $pass eq cookie(\'mwvote\')
Первым выполняется "eq" сравнение куков с паролем, а зачем "и"?