Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #82, ОКТЯБРЬ 2005 г.

Сверлим чат MTV

F-22

Хакер, номер #082, стр. 082-076-3


[скрываем html-элемент из javascript]

gt;бла бла блаgt;

gt;

document.getElementById("bla").style.display = 'none';

// скрыли

document.getElementById("bla").style.display = 'block';

// показали

gt;

Значение block работает не во всех браузерах, поэтому иногда вместо него пишут inline. Возможность иметь на странице скрытые поля появилась относительно давно, и все современные браузеры поддерживают эту спецификацию (имеется ввиду IE >gt; 5.0, Opera >gt; 5.0, Firefox 1.x, и так далее). Используются они в основном для сокрытия от глаз пользователя ненужной информации, той, которая, например, предназначена для поисковых систем. Однако разработчики чата Mtv решили использовать «скрытые» поля совсем для других целей…

[интересное в chat.js]

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

[функция добавления нового пользователя чата]

function addUser(id, name, isAdmin)

{

removeUser(id);

var currFrame = top.frames['co_list'];

var listDiv = currFrame.document.getElementById('userList');

…//skipped

var img = infoArea.appendChild(currFrame.document.createElement('IMG'));

img.src = 'i/' + (isAdmin ? 'info-admin.gif' : 'info-user.gif');

img.width = 13;

img.height = 9;

img.border = 0;

img.align = 'absmiddle';

img.alt = 'Info';

Просматривая код функции дальше, я натолкнулся на еще более интересный участок кода:

[интересный участок кода]

var adminArea = newUserDiv.appendChild(currFrame.document.createElement('SPAN'));

adminArea.className = 'block';

adminArea.style.display = bIsAdmin ? 'inline' : 'none'; //эта строка интереснее всего

eval('adminArea.onclick = function() { openAdminInteface(\'' + id + '\'); return false; }');

На самом деле, не нужно глубоко вникать в объектную модель системы, чтобы понять: в зависимости от переменной bIsAdmin (true или false) у объекта adminArea меняется свойство display (inline или none, то есть показать или скрыть). Совершенно понятно, что изучаемый сценарий также управлялся снаружи серверным приложением, которое передавало переменную bIsAdmin, в зависимости от значения которой и принимается решение: показывать ли пользователю ссылку на административный интерфейс.

Просмотрев код chat.js дальше, я наткнулся на еще более удивительную вещь: адреса страниц для администрирования чата и для получения информации о пользователе были прописаны в скрипте явно, это были aspx-скрипты, которые принимали своим параметром id пользователя и назывались userblock.aspx и userinfo.aspx, соответственно. Вот это супер!

Назад на стр. 082-076-2  Содержание  Вперед на стр. 082-076-4