День добрый! Проблема следующая: существует гостевая книга, guestbook.cgi - это скрипт разбирающий, что ему передаем post-ом и выводит форму для отправки нового комментария. Хочу сделать простейшую защиту от спама: просто сложить 2 рандомных числа, но проблема в том что их я генерирую, нажимаю submit, и перменные пропадают((( так как скрипт загружается заново... Решение проблемы с помощью скрытых полей, мне показалась совсем не надёжное, так как достаточно просто загрузить скрипт боту и найти два поля rand1 rand2 в них уже есть значения вот код скрипта, и вообще пишу на перле первый раз сайт какие тут есть дефекты, недостатки.... | Код | #!/usr/bin/perl -w # Вывод поля заголовка о типе содержимого print "Content-type: text/html\n\n"; # Подключаемые модули use DBI; use CGI::Carp qw(fatalsToBrowser); require 'lb_scr/_dbconf.pl'; require 'lb_scr/_stdlib.pl'; require 'lb_scr/_html.pl'; # Программа &show_headle("Книга предложений"); #вывод заголовка #&counter; # счетчик - его тут нету # интрефейс &show_banner; &show_menu; &show_reklama; &show_head('Отзовы и пожелания'); #---------------------------------------------- &recvquery_post; # получаем постом хешь $userdata{'имя поля в форме'} &test_query; # проверка &show_gb; # вывод гостевой из базы &show_add; № вывод формы с генерацией значений $rand1 $rand2 &show_endhtml; exit(0); # Конец
sub test_query{ if (($userdata{'usr'} ne '') && ($userdata{'mail'} ne '') && ($userdata{'text'} ne '') && ($userdata{'picpass'} ne '')){ # Проверка корректности вводимых данных use locale; if ($userdata{'usr'}!~/^\w+/){ print <<USR_ERR; <div class ="text"><h3>Не верные параметры ввода поля usr</h3></div> USR_ERR exit(0); } no locale; if ($userdata{'mail'}!~/^\w{1,10}@\w{1,10}\.\w{1,5}/){ print "<div class =\"text\"><h3>Не верные параметры ввода поля mail</h3></div>"; exit(0); } if ($userdata{'picpass'}!~/^[0-9]+/ || ($userdata{'rand2'} + $userdata{'rand1'}) != $userdata{'picpass'} ){ print "<div class =\"text\"><h3>Не верные параметры ввода поля $rand2 $rand1 $userdata{'picpass'}</h3></div>"; exit(0); } $userdata{'text'} = html2txt($userdata{'text'}); $userdata{'text'} =~ s/\r//g; # Вызов подпрограммы подключения к базе данных &db_connect;
# Выполнение запроса на добавление $dbh->do(" INSERT INTO $tbl_gb VALUES ( DEFAULT, '$userdata{'usr'}', '$userdata{'mail'}', '$userdata{'text'}', NOW())" );
# Отключение от базы данных $dbh->disconnect(); } }
sub show_gb{ # Вызов подпрограммы подключения к базе данных &db_connect;
# Подсчет записей в таблице новостей $sth = $dbh->prepare("SELECT count(*) FROM $tbl_gb"); $sth->execute(); $count = $sth->fetchrow_arrayref()->[0]; $sth->finish(); # Отключение от базы данных и завершение работы скрипта в отсутствие новостей if($count < 1){ $dbh->disconnect(); print "<p class=\"text\">Записей нет.</p>\n"; &show_add; &show_endhtml; exit(0); } # Выборка новостей из таблицы $sth = $dbh->prepare( "SELECT $fld_gb_usr, $fld_gb_email, $fld_gb_text, $fld_gb_date FROM $tbl_gb ORDER BY $fld_gb_date DESC" ); $sth->execute(); # Инициализация строки вывода данных $output = ''; while($row = $sth->fetchrow_arrayref()){ $usr = $row->[0]; $mail = $row->[1]; $text = $row->[2]; $date = $row->[3];
# Преобразование данных, полученных из базы, для отображения на веб-странице $text = '<p>' . $text if($text) !~ /^<p>/; $text .= '</p>' if($text) !~ /<\/p>$/; $date = russian_date($date);
# Формирование строки вывода данных $output .= <<HTML; <div id="usr"> $usr </div> <div> $mail </div> <div> $text </div> <div id="date"> $date </div> HTML } $sth->finish();
# Отключение от базы данных $dbh->disconnect(); # Вывод данных } sub show_add{ $rand1=int(rand(100)); $rand2=int(rand(100)); print <<FORM; <div id="text"> $output <hr/> <form action = "/cgi-bin/guestbook.cgi" method = "POST" > <p>Имя<br><input type="text" name="usr" maxlength="200"></p> <p>Емайл<br><input type="text" name="mail" maxlength="50"></p> <p>Сообщение<br><textarea name="text" rows="10" cols="30"></textarea></p> Введите код<p>$rand1+$rand2=<input type="text" name="picpass" maxlength="4"> $result</p> <p><input type="submit" value="Записать" ></p> <input type="hidden" name="rand1" value=$rand1> <input type="hidden" name="rand2" value=$rand2> </form> </div> FORM }
|
Это сообщение отредактировал(а) DaemonSuw - 25.5.2008, 23:46
|