|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Pavel V. Ammosov 2:5020/52 18 Apr 2001 01:28:31 To : All Subject : Re: POSTing to CGI -------------------------------------------------------------------------------- >y меня тогда вопpос с дpyгой стоpоны >как все-таки запpетить сеpвеpy пpинимать данные из "чyжих" фоpм?? >вопpос очень актyальный. При генерации добавляй в код формы некоторую переменную forum_id, в которою запихивай случайную строку и сохраняй эту строку у себя в БД где-нибудь. При получении данных из формы проверяй, есть ли у тебя в БД такой forum_id. Hапример: файл icbm_coord.tt2 <html><head><title>Координаты цели</title></head> <body><h1>Координаты цели</h1> <form action="process.pl" method="post"> <!-- Коодинаты цели для МБР - ширина, долгота, высота над уровнем моря ;-) --> Долгота: <input type="text" name="longitude"><br> Широта: <input type="text" name="latitude"><br> Высота над уровнем моря: <input type="text" name="altitude"><br> <input type="hidden" name="form_id" value="[% form_id %]"> <!-- form_id потом при помощи TT2 установим --> <input type="submit" value="Задать цель"> </form></body></html> файл icbm_coord.pl #!/usr/bin/perl -w use strict; use Template; # Template Toolkit с CPAN use Digest::MD5 qw(md5_hex); use DBI; my $dbh = DBI->connect('dbi:Informix:apavel', '', '', {AutoCommit=>0, RaiseError=>1}); my $template = new Template(); my $form_id = random_string(); $dbh->do('insert into forms(form_id, issue_date) values (?, CURRENT)', {}, $form_id); print "Content-Type: text/html; charset=koi8-r\n\n"; $template->process("icbm_coord.tt2", {form_id=>$form_id}) or die $template->error(); $dbh->commit(); $dbh->disconnect(); sub random_string() { use Symbol; my $f = gensym(); my $amount = 1024; open $f, "</dev/urandom" or die "/dev/urandom: $!"; my $data; read($f, $data, $amount); close $f; return md5_hex($data); } файл process.pl #!/usr/bin/perl -w use strict; use DBI; use CGI qw(param); my $dbh = DBI->connect('dbi:Informix:apavel', '', '', {AutoCommit=>0, RaiseError=>1}); # получить координаты, отфильтровать все кроме цифр. my ($latitude, $longitude, $altitude) = map {my $p = param($_) || ""; $p=~ s/[^\d]//gs; $p} qw(latitude longitude altitude); # Результат md5_hex может содержать еще и буквы a-f, поэтому надо другой # фильтр my ($form_id) = map {my $p = param($_) || ""; $p =~ s/[^0-9a-f]//gs; $p} qw(form_id); print "Content-Type: text/plain; charset=koi8-r\n\n"; if ($dbh->selectrow_array('select form_id from forms where form_id=?', {}, $form_id)) { # Hаша форма, занесем цель в таблицу координат $dbh->do('insert into coords(longitude, latitude, altitude) values (?, ?, ?)', {}, $longitude, $latitude, $altitude); # И удалим form_id из таблицы с формами $dbh->do('delete from forms where form_id=?', {}, $form_id); $dbh->commit(); print "Ok, цель занесена в список"; } else { print "NAK, не наша форма или тайм-аут закончился"; } $dbh->disconnect(); sql к ним (Я использую informix, у других СУБД синтаксис скорее всего будет иным): CREATE TABLE forms ( form_id CHAR(32) primary key, issue_date DATETIME YEAR TO SECOND NOT NULL ); CREATE TABLE coords ( target_id SERIAL(4) primary key, longitude FLOAT NOT NULL, latitude FLOAT NOT NULL, altitude FLOAT NOT NULL ); -- Pavel Ammosov O \ apavel@aha.ru __ ) http://isabase.philol.msu.ru/~apavel/ ) wget -O - isabase.philol.msu.ru/~apavel/key.asc|pgp -fka O / --- slrn/0.9.6.3 (Linux) * Origin: Zenon N.S.P. news server (2:5020/52.0) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/8361100ba6cd0.html, оценка из 5, голосов 10
|