Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Pavel Ammosov                        2:5020/52      25 May 2001  15:24:58
 To : All
 Subject : Re: проверка для формы
 -------------------------------------------------------------------------------- 
 
 > Hi, All.
 
 Былоб здорово, если бы ты у себя text wrap в районе 70хх символов включил.
 
 >    Тут как то писали, что один из вариантов проверки того, с моей ли
 > формы мне приходят данные - это приписывать к форме некий случайный
 > номер и хранить его у себя в базе данных. А потом проверять, когда
 > от формы получены параметры искать этот номер у себя в базе данных.
 >     Я написал две функции, одна просто возвращает случайное
 > число (чтобы потом приписать его к форме), а вторая
 > получает это число и смотрит, есть ли в базе такое и не
 > слишком ли оно устарело (критерий старости - один час).
 
 >     В общем помогите это всё оптимизировать немного. И ещё вопрос: что
 > я делаю не так, почему не удаляется из файла запись во второй функции?
 
 > sub get_number
 > # отдаёт случайное число. И записывает его вместе с временем в файл.
 > {
 > my $random= substr(md5_hex(int(rand 55)),0,5); #я решил, что мне хватит и
 > 5цифр
 
 на дворе 70й год и каждый байт памяти на счету, чтоль? :-)
 
 > my $hour = (localtime(time))[2];
 > my $string=join('' , $random, ' ', $hour,);
 
 Хранить только час недостаточно. Hапример, сейчас 14:50, а через 10 минут будет
 уже 15:00 и с точки зрения твоей системы пройдет час.  Лучше хранить
 время в секундах (time() такое предоставляет) и вычислять разность между
 временем будет проще -- голая арифметика с целыми.
 
 my $string = "$random " . time() . "\n";
 
 >  open (ACC, "+<access.dat") || die "can't open access.dat for writing";
 
 тут надо flock() сделать, иначе два пришедших одновременно запроса могут
 разнести твой файл.
 
 >  my @tmp=<ACC>;
 >  @tmp=("$string \n", @tmp);
 
 push @tmp, $string;
 
 >  seek(ACC,0,0);
 >  print ACC @tmp;
 >  close ACC;
 
 >  return($random);
 > }
 
 > sub check_number
 > {
 > my($num)=@_; #это номер, который потом ищется в базе данных
 
 > my $hour = (localtime(time))[2]; my (@tmp, %mass);
 
 my $now = time();
 
 > open (ACC, "access.dat") || die "can't open access.dat";
 
 к die стоит добавить $!, чтоб когда оно помрет, узнать причину:
 can't open access.dat: No such file or directory
 
 > while (<ACC>)  {
 >     chomp;
 >     my ($s_num,$s_time) = split(/\s+/, $_);
 >         $mass{$s_num} = $s_time;
 > }
 > close ACC;
 
 > if (exists $mass{$num}) {
   
     if ($mass{$num} < $now - 3600) { # прошло больше часа
          return "0"; 
       }  else {
 
 >         delete $mass{$num};
 >         open (ACC, "access.dat") || die "can't open access.dat";
 >         my $arr;
 >         foreach my $k (keys %mass) {
 >             $arr=join('', $k, ' ', $mass{$k}, "\n"); 
 >       }
 >         close ACC;
           
      delete $mass{$num};
      open ACC, "+>>access.dat" or die "access.dat: $!";
      flock ACC, LOCK_EX if (!windows9x); # на windows 9x flock не
      # работает, поэтому тут надо написать проверку на работу под
      # этой платформой и надеятся, что не возникнет коллизии
      seek ACC, 0, 0;
      truncate ACC, 0;
      print ACC join("\n", map {"$_ $mass{$_}"} @mass), "\n";
      close ACC;
           return "1";
 
 >         }
 
 >     }
 > }
 
 > При этом почему-то если номер и существует, то он не удаляется из базы данных.
 
 Hу, кода-то для удаления у тебя не написано.
 
 > ну а потом нечто вроде:
 > my $a=get_number();
 > my $b=check_number($a);
 > if ($b=='0') {print "error. Access NOT granted";}
 > elsif ($b=='1') {print "OK. Access granted";}
 > З.Ы. всё это пишется под Винду98 на АктивСтейт перле 5.6.1
 
 > Bye, All.
 
 -- 
 Pavel Ammosov                                               O    \
 apavel@aha.ru                                                 __  )
 http://isabase.philol.msu.ru/~apavel/                             )
 wget -O - isabase.philol.msu.ru/~apavel/key.asc|pgp -fka    O    /
 
 --- FIDOGATE 4.4.0-snp10
  * Origin: Zenon N.S.P. news server (2:5020/52.0)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 проверка для формы   Anton Kudris A.   24 May 2001 14:14:14 
 Re: проверка для формы   PROext   25 May 2001 11:33:08 
 проверка для формы   Anton Kudris A.   25 May 2001 18:07:00 
 Re: проверка для формы   Pavel Kurnosoff   28 May 2001 01:22:38 
 Re: проверка для формы   Alexander Beskhmelnitsyn   25 May 2001 08:44:29 
 проверка для формы   Anton Kudris A.   25 May 2001 18:00:06 
 Re: проверка для формы   Alexander Beskhmelnitsyn   28 May 2001 08:04:34 
 Re: проверка для формы   Artem Chuprina   28 May 2001 11:35:51 
 проверка для формы   Anton Kudris A.   28 May 2001 15:45:15 
 Re: проверка для формы   Artem Chuprina   28 May 2001 18:30:11 
 проверка для формы   Anton Kudris A.   26 May 2001 01:18:13 
 RE:проверка для формы   Sergey Krutyko   25 May 2001 09:28:47 
 Re: проверка для формы   Pavel Ammosov   25 May 2001 15:24:58 
Архивное /ru.cgi.perl/29625dd74e0a8.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional