Скрытая передача данных из форм
Обмен данными в Web-технологии подробно рассматривается в другой главе — "CGI и формы". Программирование элементов форм обсуждается в разделе "Программируем формы". В этом разделе мы рассмотрим вопрос о возможности передачи скрытых от пользователя данных.
Рассмотрим следующий пример. Нажмите на кнопку "Подписка" и посмотрите на строку location своего браузера. Вы обнаружите там два поля, которых нет в заполняемой вами форме: h1 и h2. Это уже неприятно, хотя сама информация в них отнюдь не криминальная (location.href и document.referer). Это означает, что в тексте страницы есть вызов функции со строками типа:
<SCRIPT> document.f.h1.value = window.location.href; document.f.h2.value = window.document.referer; </SCRIPT>
Теперь посмотрим другой пример. Если начать вводить данные в левом фрейме окна примера, то, как только вы переходите от поля к полю, в правом фрейме заполняются соответствующие поля. Cкрипт из правого фрейма читает данные из полей левого фрейма. В кодах это будет выглядеть примерно так:
function ask() { document.forms[0].elements[0].value= window.top.frames[0].document.forms[0 ].elements[0].value; document.forms[0].elements[1].value= window.top.frames[0].document.forms[0 ].elements[1].value; document.forms[0].elements[2].value= window.top.frames[0].document.forms[0 ].elements[2].value; document.forms[0].elements[3].value= window.top.frames[0].document.forms[0 ].elements[3].value; setTimeout("ask();",100); } ... <BODY onLoad="ask();" BGCOLOR=lightyellow TEXT=navy>
Это означает, что данные из одного окна могут быть считаны программой из другого окна. Вопрос только в том, хотите ли вы, чтобы это происходило. Как решаются эти вопросы, рассказано в разделе "Модель безопасности".
Еще один пример — отправка данных по событию без наличия какой-либо формы в документе вообще.
<FORM NAME=hf ACTION="javascript:window.alert('Готово'); void(0);" METHOD=post> <INPUT NAME=hfi TYPE=hidden> </FORM> <SCRIPT> document.hf.hfi.value = location.href; </SCRIPT> <A HREF="javascript:window.alert('Внимание'); void(0);" onClick="document.hf.submit();"> Нажми на ссылку </A>
Результат исполнения:
Нажми на ссылку
Согласно примеру при нажатии на гипертекстовую ссылку произойдет не только выдача сообщения, которое в этой ссылке указано, но и событие Submit для формы. В итоге вы получите два окна предупреждения. Но второе окно вы не заказывали!
Конечно, бесконтрольной передачи данных на сервер можно избежать, введя режим подтверждения отправки. Но, во-первых, многие пользователи его отключают, а во-вторых, можно использовать не формы, а, например, графику. И эту возможность мы рассматриваем в разделе "Невидимый код".