Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать перменные скрипту? помогите разобраться :0) 
:(
    Опции темы
DaemonSuw
Дата 25.5.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 11.3.2008

Репутация: нет
Всего: 3



День добрый!
Проблема следующая:
существует гостевая книга, 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
PM MAIL ICQ   Вверх
shamber
Дата 26.5.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



DaemonSuw, использовать БД(хоть текстовую, хоть другую какую) и передавать идентификатор сессии.
PM MAIL Jabber   Вверх
nitr
Дата 26.5.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



Можно и без БД

Добавлено через 1 минуту и 28 секунд
Только что обсуждали GD::SecurityImage. Вам точно поможет captcha, не всегда её с БД связывают.


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.