Защита почты с сайта на перл

  • Автор темы proparket
  • Дата начала
P

proparket

#1
Всем доброго дня или вечера.
Есть на моем сайте почта (на перле .cgi) и все работает и в архив отлично пишет. Но как в плохих романах есть всегда это "но". Было уже три раза как мне спамили из сайтовой почты (с одним и тем же текстом). В последнее время проводил доработку своего форума и доски объявлений с помощью автора скрипта Spamcode (содержит генератор картинки с буквами, проверка на мат и корякский язык) - один из вариантов капчи. В данный момент автор работает над своим проектом CMS и я не могу его отвлекать, а у меня самого ничего не выходит. Я учился на художника, а не на программера.
Требуется вставить в тело скрипта почты проверку на spamcode, проверку формы "message" на предмет запретных слов и вывод текста при какой-либо ошибке. Я, конечно, пробовать могу только методом тыка и при помощи корявых мозгов получается только 500 ошибка.
Вот и шастаю по форумам - кто бы помог справиться
Код:
#!/usr/bin/perl

$mailprog = '/usr/lib/sendmail';
$thank_url = 'http://www.proparket.ru/thankyou.htm';
$archivefile = 'contact.txt';
$toname = 'Почта с сайта Proparket';
$tomail = 'moy@mail.ru';

@months = ("Января","Февраля","Марта","Апреля","Мая","Июня",
"Июль","Августа","Сентября","Октября","Ноября","Декабря");
$at = "в"; # ..это "в" для времени русского языка;

$timeoffset = +3;
$timezone = '(GMT)';

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

@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;

$FORM{$name} = $value;
}

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time+$timeoffset*3600);
$time = sprintf("%02d:%02d",$hour,$min);
$year += 1900;
$date = "$mday $months[$mon] $year $at $time $timezone";

open(HANDLE,"|$mailprog -t") || die "Can't open $mailprog!\n";
&send_message;
close(HANDLE);

open(HANDLE, ">>$archivefile") || die "Can't open archive file for writing: $!";
&send_message;
print HANDLE "\n=======================================\n\n";
close(HANDLE);

print "Location: $thank_url\n\n";;

sub send_message {
print HANDLE "To: $toname <$tomail>\n";
print HANDLE "From: $FORM{'name'} <$FORM{'email'}>\n";
print HANDLE "Subject: $FORM{'subject'}\n\n";
print HANDLE "$date\n";
print HANDLE " Это сообщение пришло со страницы $ENV{'HTTP_REFERER'}.\n";
print HANDLE " IP адрес: $ENV{'REMOTE_ADDR'}, Remote host: $ENV{'REMOTE_HOST'}.\n";
print HANDLE " Сайт пользователя: $FORM{'url'}\n";
print HANDLE "------------------------------\n\n";
print HANDLE "$FORM{'message'}";
}
А вот части кода, которые требуется вставить в этот скрипт:

Код:
############открытие библиотеки для spamcode#############
($root) = split(/\/cgi-bin\//, $ENV{SCRIPT_FILENAME});
$lib = "$root/cgi-bin/lib";
require "$lib/spamlib.pl";
############проверка на spamcode#############
$code=lc($input{'code'}); 
if($code ne &GetSPAMCode) {
print "<font color=\"#b10000\"><h2>Не в состоянии записать сообщение</h2>\n";
print "<font size=\"2\">Вы ошиблись при вводе графического кода!</font><br></font>\n";
exit;
}

############проверка на нежелательные слова#############
$CheckBW = &CheckBW(\$input{'message'});
if($CheckBW >= 10){
print "<font color=\"#b10000\"><h2>Не в состоянии записать сообщение</h2>\n";
print "<font size=\"2\">В сообщении содержится масса нежелательных выражений!</font><br></font>\n";
exit;
}

if($CheckBW >= 5){
$e_count++;
&cerror("В сообщении содержатся нежелательные выражения!<br>\n");
}
Для любопытствующих могу и целиком (поподробнее) выложить.
Посмотрел бы кто. Может в процессе записи-перезаписи вкралась ошибка синтаксическая, но может и программная. HELP
 
V

Vovochka

#2
Смотреть надо в логах апача, что в каком месте валится.