|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/29625dd74e0a8.html, оценка из 5, голосов 10
|