|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Anton Kudris A. 2:5057/21.17 24 May 2001 14:14:14 To : All Subject : проверка для формы --------------------------------------------------------------------------------
Тут как то писали, что один из вариантов проверки того, с моей ли формы мне
приходят данные - это приписывать к форме некий случайный номер и хранить его у
себя в базе данных. А потом проверять, когда от формы получены параметры искать
этот номер у себя в базе данных.
Я написал две функции, одна просто возвращает случайное число (чтобы потом
приписать его к форме), а вторая получает это число и смотрит, есть ли в базе
такое и не слишком ли оно устарело (критерий старости - один час).
В общем помогите это всё оптимизировать немного. И ещё вопрос: что я делаю
не так, почему не удаляется из файла запись во второй функции?
sub get_number
# отдаёт случайное число. И записывает его вместе с временем в файл.
{
my $random= substr(md5_hex(int(rand 55)),0,5); #я решил, что мне хватит и 5цифр
my $hour = (localtime(time))[2];
my $string=join('' , $random, ' ', $hour,);
open (ACC, "+<access.dat") || die "can't open access.dat for writing";
my @tmp=<ACC>;
@tmp=("$string \n", @tmp);
seek(ACC,0,0);
print ACC @tmp;
close ACC;
return($random);
}
sub check_number
{
my($num)=@_; #это номер, который потом ищется в базе данных
my $hour = (localtime(time))[2]; my (@tmp, %mass);
open (ACC, "access.dat") || die "can't open access.dat";
while (<ACC>)
{
chomp;
my ($s_num,$s_time)=split(/\s+/, $_);
$mass{$s_num}=$s_time;
}
close ACC;
if (exists $mass{$num})
{
if ($mass{$num}!=$hour) { 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;
return "1";
}
}
}
При этом почему-то если номер и существует, то он не удаляется из базы данных.
ну а потом нечто вроде:
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.
--- [ http://jod.formoza.ru ]Д-Д-Д-Д-Д-Д-Д-Д-Д-Д-Д-Д-їjodЪ-Д-Д-Д-Д-Д-Д--Д-Д
* Origin: я участник фаталистическо-пофигистического движения (2:5057/21.17)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/160603b0cdf31.html, оценка из 5, голосов 10
|