Технологии чата — новые возможности

Автор статьи: Андрей Кухарчик ©
Сайт Автора: Нет
E-mail Автора: Нет
Дата публикации: 25.03.2005

Долго, очень долго приходится искать в сети достаточно хороший чат. Вы можете поспорить с таким утверждением, и в чем-то, конечно, окажетесь правы, так как чатами Интернет буквально переполнен. И найти себе по вкусу место общения можно легко и быстро. Но! Если Вы захотите завести такое место у себя на собственном сайте, Вам придется согласиться со мной — нелегко найти в сети достаточно хороший чат.
После того, как свет увидела статья "Технологии чата", мне пришло немало писем. Очень во многих — просьба более подробно остановиться на некоторых моментах, которые не попали в статью. Например, часто встречается вопрос о возможности функционирования персональных комнат (так называемый приват) в чате. Этим вопросом мы сейчас и займемся поближе.

Вступление в тему
Для начала давайте сформулируем задачи и цели, а также обговорим необходимые условия для их достижения. Нам надо на базе готового чата создать максимально защищенное пространство для переписки между двумя индивидуумами. Как непременное условие — уже готовый чат с возможностью регистрации и парольного входа. То есть, ники в чате должны быть закреплены персонально, иначе теряется смысл привата. Еще нам понадобится знание того языка программирования, на котором сделан Ваш чат.
Если Вы смогли сделать его сами, это будет большим плюсом (тут имеет смысл отослать Вас к статье "Технологии чата"). Если Вы воспользовались чем-то бесплатным из Интернета, придется для начала полностью разобраться с работой чужой программы. Чаще всего это сложнее, чем написать свою собственную. Сам язык программирования практически не играет никакой роли, так как я буду рассматривать только теоретические аспекты проблемы. А переложить все это на код будет уже не трудно. Для примеров я буду использовать язык РНР, как наиболее простой и доступный. Не настаиваю на законченности и достоверности моих суждений — все описанное тут есть мои собственные изыскания по теме, и я допускаю, что существуют другие способы и алгоритмы реализации приватов в чате. Также не берусь утверждать, что предлагаемое решение является идеальным. Помните, что все, что сделано одним человеком, может быть исследовано и переделано (взломано) другим:).

Первые мысли
Так или иначе, со вступлением покончено, и мы можем перейти к делу. Первое, что приходит на ум для решения поставленной задачи — это сделать с десяток простых чатов и использовать их под приваты, разрешив вход по паролю. Это самый простой, но и самый неверный путь. Если у Вас всего несколько посетителей одновременно в чате, то такой подход еще может быть оправдан, но если все Ваши приваты вдруг окажутся занятыми, а кто-то захочет еще... И увеличение количества готовых чатов не выход, так как всегда есть способ лучше. На самом деле, все гораздо элегантней. Незачем плодить чаты, достаточно сделать один, но работать он будет не с фиксированным файлом (куда пишутся сообщения, вводимые в чат), как происходит при работе обычного чата, а с динамическим. Точнее, файлы будут создаваться по мере надобности, и таким образом снимается лимит на количество одновременно функционирующих приватов.
В первую очередь нужно подумать о том, что именно будет служить именем для файла сообщений в привате. Неплохой вариант — комбинация ника и пароля. Только не прямая, конечно, комбинация, а как-либо зашифрованная. Еще вариант — генерация уникального имени в каталоге. Такую возможность предоставляют многие языки программирования (например, РНР, конечно). Если нет такой возможности, можно генерировать случайное число и использовать его для имени файла. Только... Эти способы не дают абсолютной гарантии уникальности. А имя файла для привата должно быть обязательно уникальным.
Ну, конечно, у меня есть для Вас готовое решение:). Способ генерации уникального имени до безобразия прост. Нужно использовать функцию времени, прошедшего с начала эпохи UNIX...

О времени UNIX
Давным-давно, когда компьютеры еще были очень большими, а программы очень маленькими, появилась необходимость отсчитывать время. Так или иначе, но у программистов прижился метод отсчета времени UNIX. Начинает свой отсчет это время с 1 января 1970 года. Первая секунда этой даты считается первой, вторая — второй и т.д. На сегодня набежало уже достаточно большое число, но это не страшно для нас, так как вручную считать нам не приходится. Важно, что время UNIX есть количество секунд (кстати, не только секунд — ведется подсчет и миллисекунд), прошедшее с 1 января 1970 года.
Вот это количество секунд служит идеальным генератором случайных имен файлов для персональных комнат в чате. Главное в нем — это уникальность имени. А сформировать такое имя очень просто — достаточно считать (для этого во всех современных языках программирования есть специальные функции) показания секундомера UNIX и склеить полученное значение со строкой, включающей в себя точку и расширение, которое Вы хотите видеть у файла с сообщениями привата.
Кстати, к расширению стоит отнестись ответственно. Проще всего выбрать его, конечно, стандартным (.txt, например...), но я бы рекомендовал использовать дополнительные возможности, которые дает нам сервер при использовании динамических страниц. Как правило, сервер не позволяет извне просматривать код некоторых файлов, и их расширения нам никто не запрещает использовать в своих целя. Для примера я опять же воспользуюсь примером РНР.

О расширениях в РНР
Для того чтобы сервер узнал, есть в файле код РНР или нет, изменяют расширение файла. Если обычно используется расширение .htm или .html, то в РНР Вы должны будете использовать несколько другие — например: .phtml, .php, .php3 или другие, в зависимости от настроек сервера. Так или иначе, но файл с расширением РНР уже не будет доступен в том виде, в котором он существует на сервере. Любой код РНР будет скрыт, а в браузер пойдет только результат работы скрипта-программы. Если только... этот результат есть. Например, в коде РНР очень удобно прятать комментарии к коду HTML. Клиенту такой комментарий не передается, а самому понятно, что, где и как. Так вот, если весь файл РНР состоит из одного комментария, браузер посетителя так ничего и не получит.
Вот такое место удобно использовать для сокрытия информации. Для этого обзовем наш файл расширением РНР, а в его первой строке откроем комментарий (в РНР это будет выглядеть так: <? /*). Таким образом, если даже имя файла каким-либо образом станет известно, получить из него информацию будет несколько трудновато, ведь комментарий РНР не передается браузеру! Это дает дополнительную гарантию конфиденциальности. Кстати, заботиться о закрытии комментария не стоит, так как реально файл не будет никогда исполняться, а если кто-то обратится непосредственно к нему, сервер вернет ошибку. Что, в принципе, нас устраивает. Мы же в полой мере сможем писать в такой файл и выводить его на экран в приватный чат. Собственно, для нас вообще не имеет значения расширение, единственное, что надо помнить, — это о первой строке, уже занятой под тег открытия кода и под комментарий.
Эта же строка нам понадобится для авторизации. В нее нужно дописать ники двух пользователей, которым доступен именно этот файл с сообщениями. Каждый раз при авторизации нужно проверять, совпадают ли имена входящих в чат с теми, что записаны в этой строке, и на основании полученных данных пропускать или нет в приват посетителя. Рассмотрим эту технологию подробней...

О том, как приглашать в приват
Для приглашения в приват может использоваться или ссылка, или кнопка — это дело вкуса и возможностей. Нажав на такую ссылку, посетитель попадает на страничку, где ему предлагают выбрать, кого именно из присутствующих в чате в данный момент он желает пригласить в приват. Конечно, технологию отображения присутствующих чат должен поддерживать, иначе придется предлагать выбор из всех зарегистрированных ников, что будет просто некрасиво с нашей стороны. По ссылке нужно передать методом GET данные, авторизовывающие человека, открывающего чат. По кнопке — можно использовать (я бы даже сказал — лучше) метод POST. Впрочем, никто не запрещает заставить ввести лишний раз пароль. Это не суть важно. На этом этапе обязательно нужно проверить, есть ли такие пользователи среди зарегистрированных в чате, — это чтобы заблокировать возможность несанкционированного входа. Тут же можно предоставить входящему возможность немного настроить свой чат: выбрать цвет, скорость обновления и т.д. Когда все, что нужно, выбрано (самое главное — кого пригласить в чат), посетитель жмет на кнопку входа, и запускается программа генерации привата.

Как сделать персональную комнату
Будьте внимательны, так как мы перешли к важным вещам. Сначала, как и всегда, нужно проверить правильность пароля и ника. Если все нормально и такой пользователь зарегистрирован, переходим к тому, кого он пригласил. Эту персону тоже надо проверить. Ну, например, на факт присутствия в чате. Если это дело прошло успешно, двигаемся дальше.
Нужно сформировать данные для авторизации. Для этого считываем время UNIX (тут и дальше примеры на РНР):
$time = time(void);

Определяем имя файла, используя любой путь к файлу:
$file = "любой путь".$time.".phtml";

Формируем строку для записи в несуществующий пока файл:
$sav = "<?/**$person*для*$kto*\n";
где в переменных $person и $kto хранятся соответственно ники приглашающего и приглашенного в приват. И записываем строку $sav в файл специальной командой. Надо сказать, что подобные команды устроены таким образом, что если файл не существует, он создается. Но! Создаваться он будет только в том случае, если на каталоге, где он создается, установлены соответствующие права.

Немного о правах
Без этого тоже далеко мы не уйдем, так что прежде давайте рассмотрим, что такое права доступа (кому проще — атрибуты). Если Вы работаете в системе, основанной на Windows, можете забыть о правах и пропускать данный абзац, но так как большинство серверов в Интернет работают на других, более стабильных платформах:), Вам надо знать следующее. У каждого файла в сети есть права доступа. Устанавливать их может только хозяин или его программы. Проще всего для смены атрибутов воспользоваться любой FTP-программой. Они, как правило, все поддерживают такую возможность. Для примера могу предложить Windows Commander. Это, конечно, не FTP-программа в полной мере, но базовые функции выполняются очень хорошо.
Сделать нужно следующее. Создать новое FTP подключение, подключиться к удаленному серверу (конечно, Вам понадобится логин и пароль), указать на какой-либо файл или каталог (в нашем случае Вы должны будете выбрать тот каталог, в который будут записываться файлы приватов). В меню ФАЙЛ выбрать пункт ИЗМЕНИТЬ АТРИБУТЫ. В появившемся окошке надо установить все галочки. Дальше — ОК, как обычно. Все!

Как связаться с приглашенным
Ну, тут можно воспользоваться самым простым методом — выдать приглашение в основной чат. Только кроме самого приглашения передать кое-какие параметры. Все должно быть оформлено в виде ссылки, чтобы приглашенный мог просто нажать на нее, ввести в открывшейся страничке пароль и сразу попасть в приват.
Но вернемся к параметрам. Конечно, передаваться в ссылке на приглашение должно имя файла привата, сгенерированное с помощью функции времени UNIX. Но передавать его просто так в открытом виде нельзя. Тут придется применить любой из обратимых методов шифрования. Можно сделать проще — выполнить ряд обратимых арифметических действий. Ведь передавать нужно простое число, которое можно сложить с другим. Это на Ваше усмотрение.
Кроме зашифрованного имени файла, надо передать идентификатор приглашенного, чтобы никто кроме него не мог попасть в приват. Тут будет сложнее. Я рекомендую воспользоваться тем методом, на основе которого реализована авторизация в чате. А можно придумать что-нибудь еще. В принципе, можно передавать и сам ник, мы предусмотрели дополнительную защиту от чужого проникновения в приват, когда записали ники имеющих право войти в него в первую строчку файла привата.

Последняя стадия авторизации
Мы подошли к последней из авторизаций перед входом в чат. Собственно, ничего необычного на этом этапе не намечается. Приглашенному в приват тоже можно дать возможность настроить его под себя, конечно, проверка пароля и всяких там учетных записей, и, наконец, если все нормально, можно разрешить вход в чат. Только не забудьте расшифровать имя файла привата. Его, как и ник входящего, надо передать в чат методом GET. Это нужно для того, чтобы приват мог каждый раз отслеживать и идентифицировать эти данные.

О самом главном
Вот, собственно, и все. Осталось упомянуть о том, что при работе привата надо каждый раз проверять соответствие ников вошедших с теми, что записаны в файле привата. Имя файла не должно появляться в ссылках ни на одном из этапов входа в приват. Пользуйтесь везде разными формулами для скрытия истинного числа — имени файла привата. Генерируйте каждый раз новую формулу, если только придумаете, как.
Сам чат для привата стоит выбрать как можно проще и быстрее. Люди приходят туда не за наворотами, а спокойно поговорить в полной уверенности, что их не подслушают. Хорошим тоном считается наличие кнопочки, очищающей разговоры в привате. Еще лучше, если после выхода файл будет удаляться с сервера. Но это на выбор, все равно не каждый будет перед выходом жать на специальную кнопку, гарантирующую удаление записей.
Проявите свою фантазию и попробуйте усовершенствовать приведенную схему. Если Вы хотите посмотреть на работу описанного механизма в живую, это можно сделать тут: http://virtual.bresttelecom.by/. Дальше по ссылке ЧАТ САЙТА.