Ключевые слова:web, html, cgi, example, (найти похожие документы)
Date: Wed, 18 Apr 2001 00:28:31 +0400
From: "Pavel V. Ammosov" <Pavel.V.Ammosov@f52.n5020.z2.fidonet.org>
Newsgroups: fido7.ru.cgi.perl
Subject: как запpетить скрипту пpинимать данные из "чyжих" фоpм
>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 /
ИМХО Этот способ может быть не вполне надежным (хотя приемлемым для многих сайтов). Например, можно настроить "вражеский" скрипт так, чтобы он сначала вытягивал form_id через обычное подключение по http, а затем отправлял данные формы вместе с этим form_id, который будет обработан как правильный. Вот по этой причине, многие мэил серверы (hotmail i dr.) сейчас вместо обычного text-only id генерируют id в виде "смазанной" графической информации и просят пользователя ввести в поле тот текст, что он видит на картинке. Этот способ мне кажется куда более надежным.
У меня такая проблема написал на Java script форму
которая отсылает данные мне на сервак использовал метод пост, а на Perl написал скрипт который принимает. На севаке Perl не оказалось. Теперь необходим скрипт на Java.
Заранее благодарен.