Скрытые поля формы

Скрытые поля позволяют хранить “невидимую” информацию в форме документа. Такие поля не отображаются браузером, но это вовсе не означает, что информация спрятана, любой может увидеть ее, вызвав опцию браузера “View Source”. Таким образом скрытые поля нельзя использовать в целях безопасности, а можно только в целях прозрачной передачи информации.

Приведу пример определения двух скрытых полей формы:

<form action=”/cgi-bin/sendmail.pl” method=”post”>

<input type=”hidden” name=”mail_to”
value=”andrey@novikov.com”>
<input type=”hidden” name=”subject”
value=”Test letter”>

</form>

При посылке формы, данные, заключенные в скрытые поля, кодируются и посылаются серверу точно так же, как и данные других полей. Для CGI-сценария нет никакой разницы между скрытыми и видимыми полями.

Простейшим способом использования скрытых полей для сохранения контекста является запись данных формы в скрытые поля следующей формы. Приведу пример первой формы:

<form action=”/cgi-bin/firststep.pl” method=”post”>
Введите Ваше имя: <input type=”text” name=”realname”>
<br>
Введите Ваш адрес: <input type=”text” name=”email”>
<br>
<input type=”submit” name=”Send”
value=”Следующий шаг”>
<input type=”reset” name=”Reset” value=”Очистить”>
</form>

При посылке этой формы на сервер соответствующий сценарий динамически генерирует следующую форму, содержащую скрытые поля:

<form action=”/cgi-bin/secondstep.pl” method=”post”>
<input type=”hidden” name=”realname”
value=”Андрей Новиков”>
<input type=”hidden” name=”email”
 value=”andrey@novikov.com”>
Город проживания: <input type=”text” name=”city”>
<br>
<input type=”submit” name=”Send”
value=”Следующий шаг”>
<input type=”reset” name=”Reset” value=”Очистить”>
</form>

И так до самого конца. Достоинством такого подхода является отсутствие необходимости временных файлов и “волшебных cookies”. С другой стороны недостатком такого подхода авляется снижение производительности при обработке форм с большим количеством полей.

Приведу пример скрипта, который генерирует форму, вставляя в нее все полученные параметры в ввиде скрытых полей:

#!/usr/local/bin/perl
print “Content-type: text/html\n\n”;

read(STDIN, $buffer, $ENV{‘CONTENT_LENGTH’});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   local($name, $value) = split(/=/, $pair);
   $name =~ tr/+/ /;
   $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,
    hex($1))/eg;
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,
    hex($1))/eg;
   $value =~ s/<!–(.|\n)*–>//g;
   $FORM_DATA{$name} = $value;
}

print ‘<form name=”newtext” action=”newtext.pl”
 method=”post”>’,”\n”;
foreach $key (keys %FORM_DATA) {
  $value = $FORM_DATA{$key};
  print “<input type=hidden name=\”$name\”
   value=\”$value\”>\n”;
}
print <<END;
Можете добавить мысль:<br>
<textarea name=”text” rows=5 cols=50></textarea><br>
<input type=”submit” name=”post” value=”Добавить”>
<input type=”reset” name=”escape” value=”Очистить”>
</form>
END

Того же результата можно достичь несколько другим способом. При этом нет необходимости генерировать все документы, содержащие форму, динамически. Достаточно создать один сценарий, который будет пропускать сквозь себя документ, вставляя в него соответствующие скрытые поля. В этом случае первая форма будет выглядеть так:

<form action=”/cgi-bin/shopping.pl/firstspep.html”
 method=”post”>
Введите Ваше имя: <input type=”text” name=”realname”>
<br>
Введите Ваш адрес: <input type=”text” name=”email”>
<br>
<input type=”submit” name=”Send”
value=”Следующий шаг”>
<input type=”reset” name=”Reset” value=”Очистить”>
</form>

Обратите внимание на то, что в этом примере скрипту передается параметр PATH_INFO, содержащий имя следующего отображаемого документа с формой. Этот документ должен содержать форму, в которую сценарием shopping.pl будут добавлены все скрытые поля. Вот примерный текст такого сценария:

#!/usr/local/bin/perl
print “Content-type: text/html\n\n”;

read(STDIN, $buffer, $ENV{‘CONTENT_LENGTH’});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   local($name, $value) = split(/=/, $pair);
   $name =~ tr/+/ /;
   $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,
    hex($1))/eg;
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,
   hex($1))/eg;
   $value =~ s/<!–(.|\n)*–>//g;
   $FORM_DATA{$name} = $value;
}

$form_file = $ENV{‘PATH_INFO’};
$full_path = “/usr/local/etc/httpd/htdocs” .
 $form_file;

open(FILE, “<” . $full_path);
while (<FILE>) {
  if (/<\s*form\s*.*>/i) {
    print;
    foreach $key (keys %FORM_DATA) {
      $value = $FORM_DATA{$key};
      print “<input type=hidden name=\”$name\”
    value=\”$value\”>\n”;
    }
  } else {
    print;
  }
}
close(FILE);

Использование скрытых полей является наболее простым и интуитивно понятным механизмом сохранения контекста. Он опирается на общепринятые стандарты и требует минимум затрат при реализации.

Добавить комментарий

Вам надо войти, чтобы написать комментарий.