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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Captcha при помощи GD::SecurityImage, Проблема с проверкой сгенерированного к 
V
    Опции темы
b00
Дата 27.9.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую всех заглянувших в тему!
У меня образовалась проблема с проверкой капчи, бьюсь уже второй день и не могу даже понять, что не так.
Выражается проблема в том, что после введения капчи она всегда оказывается неправильной. Я никак не могу разобраться, проблема в кривой проверке или же в том, что после нажатия кнопи "Загрузить" на странице скрипт начинает выполняться с начала, при этом генерируется новый код, который не совпадает с введённым естественно.
Код

#!/usr/bin/perl -T
require 5.8.8;
use warnings;
use strict;
use GD::SecurityImage; #use_magick => 1;
use Digest::MD5 qw(md5_hex);
use CGI qw (:escpeHTML);
use CGI::Carp 'fatalsToBrowser';
use encoding 'utf8';
use open OUT => ':utf8';
$| = 1;

$CGI::POST_MAX = 1048576*0.2; #Максимальный размер загружаемого файла - N мегабайт
my $outpath = './tmp/';

my $cap_image = GD::SecurityImage->new(
            width    => 100,
            height    => 40,
            lines    => 4,
            rndmax    => 6,
            gd_font    => 'giant',
            frame    => 0,
            );
    $cap_image->random(int(rand(100)*rand(3)-rand(100)/rand(50)));
    $cap_image->create(normal => 'rect');
    $cap_image->particle(300,1);
my ($image_data, $mime_type, $random_number) = $cap_image->out(force => 'jpeg', compress => 100);
my $cap_digest = md5_hex(int(rand(11))+int(rand(3))+rand(100)+rand(50));
my $cap_outfile = './tmp/'.$cap_digest. '.' .$mime_type;
open(CAP_IMAGE,'>',$cap_outfile);
binmode CAP_IMAGE;
print CAP_IMAGE $image_data;
close(CAP_IMAGE);
my $cap_url = 'http://www.mysite.com/cgi-bin/' . substr($cap_outfile,2);

my $query = new CGI;
# Document header start
print
    $query->header(
            -type        =>    'text/html',
            -charset    =>    'utf-8',
            ),
    $query->start_html(
            -title    =>    'CGI test',
            -base    =>    'true',
            ); # dochead end
# Multipart form begin
print
    $query->start_multipart_form(
            -method        =>    'POST',
            -enctype    =>    'multipart/form-data',
            ),
    # Выбор файла для загрузки
        $query->br,
          "Размер загружаемого файла не должен превышать " . $CGI::POST_MAX/1048576 . " Мб.",
        $query->filefield(
                -name        =>    'uploaded_file',
                -default    =>    '',
                -size        =>    50,
            ),
        $query->br,"Введите значение капчи: ",
        "<img src=\"$cap_url\">",
        $query->textfield(
                -name        =>    'cap_value',
                -size        =>    6,
                -maxlength    =>    6,
            );
    # Отправка данных формы
print $query->submit(
                -value    =>    'Загрузить',
            );
print $query->endform; #form end
print $query->hr;

 my $cap_value = $query->param('cap_value');
 if ($cap_value){
     if ($cap_value != $random_number){
         print $query->br,"Неправильно введена капча. Попробуйте ещё раз.";
         exit 0;
     }
my $input_file = $query->upload('uploaded_file');
my $filename = $query->param->{'uploaded_file'};
my $xmloutfile;

    if (defined $input_file){
        # Проверяем тип и размер полученного файла
        my $file_type = $query->uploadInfo($filename)->{'Content-Type'};

        if ($file_type !~ m#text/[html|plain]#i){
            print $query->br,"Поддерживаются только текстовые файлы!";
            exit 0;
        }
        if (!$filename && cgi_error()) {
            print $query->header(-status=>cgi_error());
            exit 0;
        }
        if ($filename=~ m#^([\w-]+)\..+$#i){
            $xmloutfile = $outpath . $1 . '.xml';
        }
# Если все проверки пройдены - обрабатываем файл
#
#
print
    $query->br,"<span style=\"color: #00FF33;\">Работа завершена.</span> Сгенерированный файл
    <a href=\"$outfile_url\" target=\"_blank\">можно скачать</a>.",
    $query->br,
    $query->em("Через некоторое время файл будет удалён.");
    }

print $query->end_html;
exit 0;
 }
 else {
 print $query->br,"Нужно ввести проверочный код.";
 print $query->end_html;
 exit 0;
 }

Буду благодарен за любые указания на ошибки или идеи по замене моих (уверен - весьма несовершенных) механизмов проверки чем-то более элегантным.
PM MAIL WWW Jabber   Вверх
Paul56
Дата 28.9.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Посмотрите модуль Authen::Captcha там всё проще;
PM ICQ   Вверх
b00
Дата 28.9.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Смотрел, мне не понравилось, что там надо какие-то публичные и закрытые директории создавать.
А нет у Вас примера работы с ним?
PM MAIL WWW Jabber   Вверх
Paul56
Дата 30.9.2009, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Экспромтом пишу, исходники на работе.

Код

use Authen::Captcha;

    my $captcha = Authen::Captcha->new(
                    data_folder => 'temp/captcha',
                    output_folder => 'temp/outputcaptcha',
    );
  
                      
    our $md5sum = $captcha->generate_code(4); #

        print "Content-type: text/html \n\n";
    print "<img src=\"temp/outputcaptcha/",$md5sum,".png\" width=100 height=35>";



Если Вас смущает, что директории открыты, то доступ можно пофиксить с помощью .htaccess
Для проверки можно использовать что то вроде:
Код

use Authen::Captcha;
use Digest::MD5 qw( md5_hex );

my $md5sum = md5_hex('тут данные из формы');
my $captcha = Authen::Captcha->new(data_folder => 'temp/captcha', output_folder => 'temp/outputcaptcha');
my $results = $captcha->check_code('тут данные из формы',$md5sum);


переменная $results примет значения от -1 до 3 если не ошибаюсь, посмотрите документацию


Это сообщение отредактировал(а) Paul56 - 30.9.2009, 05:32
PM ICQ   Вверх
b00
Дата 30.9.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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


 




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


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

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