Hform
Скрытая передача данных из форм
Обмен данными в Web-технологии подробно рассматривается в другом курсе - "CGI и Формы". Программирование элементов форм обсуждается в разделе "Программируем формы". В данном разделе мы рассмотрим вопрос о возможности передачи данных, скрытых от пользователя.
Рассмотрим следующий пример:
Фамилия: | |
Имя: | |
Отчество: | |
e-mail: | |
document.f.h1.value = window.location.href;
document.f.h2.value = window.document.referer;
Нажмите на кнопочку "Подписка" и посмотрите после этого на строку Location вашего браузера. Вы обнаружите там два поля, которых нет в заполняемой вами форме,: h1 и h2. Это уже неприятно, хотя сама информация в них не представляет из себя ничего криминального (location.href и document.referer). Это означает, что в тексте страницы есть вызов функции со строками типа:
<script>
document.f.h1.value = window.location.href;
document.f.h2.value = window.document.referer;
<script>
Теперь посмотрим другой пример:
function wo()
{
window.open("hformfr.htm","kuku","width=600,height=200");
}
Если теперь начать вводить данные в левом фрейме окна примера, то, как только вы переходите от поля к полю, в правом фрейме заполняются соответствующие поля. 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>
document.hf.hfi.value = location.href;
Нажми на ссылочку
Согласно примеру при нажатии на гипертекстовую ссылку произойдет не только выдача сообщения, которое в этой ссылке указано, но и событие Submit для формы. В итоге вы получите два окна предупреждения. Но второе окно вы ведь не просили.
Конечно, бесконтрольной отправки данных можно избежать, введя режим подтверждения отправки. Но, во-первых, многие пользователи его отключают, а во-вторых, можно использовать не формы, а например графику. И эту возможность мы рассматриваем в разделе "Невидимый код".