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


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)
 
 

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

 Тема:    Автор:    Дата:  
 POSTing to CGI   Max Kurilov   10 Apr 2001 10:23:04 
 Re: POSTing to CGI   Artem Chuprina   10 Apr 2001 11:44:32 
 Re: POSTing to CGI   Diagil Aleksander   15 Apr 2001 19:10:07 
 Re: POSTing to CGI   Artem Chuprina   16 Apr 2001 12:03:40 
 POSTing to CGI   Dmitry Potapoff   16 Apr 2001 19:53:35 
 Re: POSTing to CGI   Artem Chuprina   17 Apr 2001 10:41:23 
 POSTing to CGI   Dmitry Potapoff   18 Apr 2001 02:42:45 
 Re: POSTing to CGI   Artem Chuprina   18 Apr 2001 16:28:40 
 POSTing to CGI   Ilya Slyzhnyak   20 Apr 2001 14:30:08 
 Re: POSTing to CGI   Pavel V. Ammosov   18 Apr 2001 01:28:31 
 POSTing to CGI   Andrey N. Demushkin   18 Apr 2001 21:13:56 
 Re: POSTing to CGI   Pavel V. Ammosov   20 Apr 2001 11:51:14 
 POSTing to CGI   Andrey N. Demushkin   20 Apr 2001 08:02:00 
 Re: POSTing to CGI   Pavel V. Ammosov   23 Apr 2001 15:37:31 
 Re: POSTing to CGI   Artem Chuprina   20 Apr 2001 11:36:40 
 POSTing to CGI   Andrey N. Demushkin   18 Apr 2001 21:12:12 
 Re: POSTing to CGI   Alex Sokolov   03 May 2001 10:15:08 
Архивное /ru.cgi.perl/8361100ba6cd0.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional