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

Скрытые поля позволяют хранить «невидимую» информацию в форме документа. Такие поля не отображаются браузером, но это вовсе не означает, что информация спрятана, любой может увидеть ее, вызвав опцию браузера «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);

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

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

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