Великое Объединение форумов
Суть проблемы: Предлагаемое решение: Перспективы: Формулировка технического задания: 0. Пересмотреть данное ТЗ в сторону максимальной совместимости с уже существующими стандартами RSS-экспорта, как простейшими (RSS Feed Егора Николаева, http://naklon.info/rss/about.htm), так и продвинутыми (Total Syndication Suite для phpBB 3.0.4, http://www.phpbb.com/community/viewtopic.php?f=70&t=1431255&start=0)
1. Разработать (либо найти готовый и обсудить на предмет пригодности) единый стандарт (формат) XML(RSS?)-ленты, содержащей всю полноту информации, необходимой для импорта сообщений, включая данные, отражающие структуру форума.
2. Проверить на предмет применимости и, при необходимости, переделать и дополнить следующую предлагаемую таблицу в базе данных, используемую модулями синдикации:
<?php
$q=<<<End
CREATE TABLE IF NOT EXISTS syndicate (
ID INT(8) unsigned NOT NULL auto_increment, //Основной индекс таблицы
host VARCHAR(32), // Хост партнёра, на котором размещён его форум, ОБЯЗАН совпадать с соответствующим именем пользователя на нашем форуме.
our_password VARCHAR(32), // Наш пароль на сайте партнёра
import_allowed BOOL DEFAULT TRUE, // Чекбокс, разрешающий или приостанавливающий импорт сообщений с хоста
import_messages_limit TINYINT UNSIGNED DEFAULT 100, // Число месагов, которое мы желаем импортить за 1 раз с этого партнёра
import_last_date DATETIME DEFAULT '1970-01-01 00:00',
import_request_template varchar(255) DEFAULT 'GET http://[host]/syndicate.php?syndicate_do=export&login=[our_host]&password=[our_password]&date=[import_last_date]&limit=[import_messages_limit] HTTP/1.1\r\n', // Шаблон запроса к партнёрскому сайту, снабжённый предупреждающей надписью "РУКАМИ НЕ ТРОГАТЬ!"
// Как вариант, в более поздних версиях вместо этого темплэйта будет выбор из списка поддерживаемых версий RSS-лент партнёрских форумов, а соответствующие им запросы будут храниться внутри скрипта.
import_period INT(8) UNSIGNED DEFAULT 600, // Минимальный период, с которым можно делать запросы к партнёру, в секундах
login_template varchar(255) DEFAULT 'POST http://[host]/login.php?referer=http%3A%2F%2Fwww.[host]%2F&UserName=[login]&PassWord=[password] HTTP/1.1\r\n', //Шаблон запроса к партнёрскому сайту на проверку пароля юзера username@host
//версия для phpBB login_template varchar(255) DEFAULT 'POST http://[host]/login.php?username=[login]&password=[password]&redirect= HTTP/1.1\r\n', //Шаблон запроса к партнёрскому сайту на проверку пароля юзера username@host
login_success_template varchar(255) DEFAULT '/Выход[^<]*</a>/si', // Шаблон положительного ответа об ауторизации в виде регулярного выражения
// Как вариант, в более поздних версиях вместо последних двух темплэйтов будет выбор из списка поддерживаемых версий движков партнёрских форумов, а соответствующие этим движкам запросы будут храниться внутри скрипта.
PRIMARY KEY (`ID`)
)
End;
?>
2. Разработать для наиболее популярных форумных движков IPB и phpBB утилиты, осуществляющие импорт и экспорт сообщений в XML-формате (см. п.1)
Утилиты должна иметь возможность инклюдиться при выполнении кода форума либо запускаться Cron'ом в качестве отдельного php-файла. Программное обеспечение должно быть представлено в открытом исходном коде, чтобы администраторы сайтов могли лично проверить его перед установкой и убедиться в отсутствии вредоносного кода.
Работа утилиты определяется параметром"syndicate_do", в зависимости от которого:
2.1. В случае, если параметр "syndicate_do" не установлен, утилита понимает, что её инклюдит скрипт ауторизации и ничего не делает. В этом случае, инклюдящий скрипт может пользоваться добавленными в утилиту функциями syndicate_get_login_template($host) и syndicate_get_login_success_template($host), возвращающими соответствующие $host значения шаблона на проверку пароля и шаблона положительного ответа.
2.2. В случае, если параметр "syndicate_do" равен "export", утилита осуществляет экспорт сообщений, используя дополнительные входные параметры.
2.2.1. Дополнительные входные параметры:
2.2.1.1. "login" и "password" - идентификатор и пароль партнёрского форума либо частного лица, запрашивающего поток сообщений (строки), либо отсутствие этого параметра.
2.2.1.2. "date" - время создания либо изменения первого отдаваемого сообщения (строка в формате GMT), либо отсутствие этого параметра.
2.2.1.3. "limit" - желательное количество отдаваемых сообщений.
2.2.2. Описание работы:
2.2.2.1.1. В начале работы утилита проверяет соответствие идентификатора и пароля, в соответствующей таблице зарегистрированных пользователей базы данных форума (если эти параметры заданы) и при несоответствии делает антибрутфорсовую паузу в 5 секунд, записывает в hacklog IP-адрес и запрошенные параметры и обнуляет параметр "login".
2.2.2.1.2. Если параметр "login" отсутствует, утилита устанавливает его в "Guest" (неавторизованный посетитель).
Для следующих версий предусмотреть более секьюрный вариант: утилита берёт данные пользователя из сессии, а сервер партнёра, обращаясь за лентой, сначала производит ауторизацию через login.php методом POST.
2.2.2.2. Утилита проверяет параметр "date" и при некорректности обнуляет его, а при корректности приводит к виду "YYYY-MM-DD HH:mm" локального времени сервера.
2.2.2.3. Утилита проверяет параметр "limit" и при некорректности устанавливает его в 10. Или в 100. Или в ещё какое-то понравившееся число (обосновать выбор в комментарии к коду).
2.2.2.4.Утилита выполняет поиск, в количестве, равном двойному значению параметра"limit", по форумам сообщений, удовлетворяющих следующим условиям:
2.2.2.4.1. Пользователь, запрашивающий ленту, имеет доступ к данной ветке форума хотя бы по чтению.
2.2.2.4.2. Имя автора сообщения не содержит символа "@".
2.2.2.4.3.1. Если параметр "date" не пуст: время создания либо последнего изменения данного сообщения больше, чем значение параметра"date"; выборка упорядочена по возрастанию максимума из дат создания и изменения сообщения.
2.2.2.4.3.2. Если параметр "date" пуст: ищутся последние по времени сообщения; выборка упорядочена по убыванию максимума из дат создания и изменения сообщения.
2.2.2.5. Выборка урезается до размеров, приблизительно соответствующих параметру "limit" по следующему правилу:
Если число сообщений в выборке превышает параметр "limit", то заданное им число сообщений отсчитывается от начала выборки, определяется время найденного сообщения, и из выборки исключаются сообщения с большим (или, в случае пустого параметра "date", меньшим) временем создания или изменения. Возможное превышение заданного числа сообщений необходимо, т.к. разные сообщения могут иметь одинаковое время создания/изменения.
2.2.2.6. Сообщения из выборки включаются в ленту в порядке увеличения времени создания или последнего изменения. Лента выдаётся партнёру.
2.2.2.7. В следующих версиях предусмотреть возможность PGP-шифрования передаваемой ленты во избежание перехвата личной конфиденциальной информации, предназначенной только для пользователей, имеющих доступ к копируемому под-форуму.
2.3.В случае, если параметр "syndicate_do" равен "import", утилита осуществляет импорт сообщений, используя дополнительный входной параметр "host" - имя хоста партнёра, с обязательным учётом кодировки сообщений форума и кодировки ленты.
2.3.1. В начале работы утилита проверяет значение параметра "host". В случае, если этот параметр не установлен, утилита устанавливает его равным хосту, у которого наименьшее значение import_last_date при установленном поле import_allowed.
2.3.2. Описание работы:
2.3.2.1. В случае, если параметр "host" некорректен, утилита завершает работу с внесением записи в лог ошибок.
2.3.2.2. В случае, если значение import_last_date для данного хоста меньше текущего времени лишь на число секунд, меньшее import_period, утилита завершает работу.
2.3.2.3. Утилита обращается к партнёрской ленте, считывает ответ и проверяет его на корректность. В случае, если ответ не является корректным XML-потоком, утилита завершает работу с записью в лог ошибок.
2.3.2.4. Утилита размещает (либо изменяет) полученные сообщения в базе данных форума с учётом прав доступа, установленных для тех или иных пользователей партнёрского форума, а также с учётом наличия либо отсутствия на форуме одноимённых разделов и тем:
2.3.2.4.1. Встречая в сообщении имя ранее не зарегистрированного пользователя, утилита регистрирует его в базе форума с именем вида "имя_пользователя@доменное_имя_партнёрского_форума", с заведомо неверным нулевым паролем, правами доступа на уровне зарегистрированного пользователя (Вариант для будущих версий и только для IPB: с правами зарегистрированного пользователя и с членством в той же группе, что и пользователь "доменное_имя_партнёрского_форума") и гиперссылкой на поиск данного пользователя на партнёрском форуме в качестве адреса личного сайта.
2.3.2.4.2. Встречая имя пользователя, не имеющего прав написания сообщений в данную тему, утилита игнорирует сообщение.
2.3.2.4.2.1. Встречая в тексте сообщения цитату пользователя, не имеющего прав написания сообщений в данную тему, утилита заменяет цитату гиперссылкой на цитируемое сообщение (если таковая присутствует) либо на поиск данного пользователя на партнёрском форуме.
2.3.2.4.3. Встречая имя под-форума, не существующего на данном форуме, утилита игнорирует сообщение.
2.3.2.4.4. Встречая имя темы, не существующей на данном форуме, но находящейся в под-форуме, существующем на данном форуме, утилита создаёт в этом под-форуме такую тему и делает автора сообщения топикстартером созданной темы.
2.3.2.4.5. Встречая сообщение, уже существующее в базе с таким же именем пользователя и датой создания, утилита сначала удаляет дубликат из базы.
2.3.2.4.6. В ходе работы утилита устанавливает значение import_last_date - наибольшее время создания либо изменения для полученных (включая проигнорированные) сообщений. Если лента не содержит ни одного сообщения, import_last_date устанавливается равным текущему времени.
3. Разработать для последних версий наиболее популярных форумных движков IPB и phpBB модификации, обеспечивающие:
3.1. Вывод в неиндексируемом поисковиками виде сообщений, имена авторов которых содержат знак "@".
3.2. При авторизации с логином вида "имя_пользователя@доменное_имя_партнёрского_форума" - проверку пароля на партнёрском сайте методом передачи на партнёрский форум запроса, хранящегося в поле таблицы login_template, и если ответ соответствует шаблону из поля login_success_template, то создание пользователя "имя_пользователя" со всеми правами пользователя "имя_пользователя@доменное_имя_партнёрского_форума" и введённым паролем и установку данных созданного пользователя в сессии.
3.3. Блокировку регистрации с именем "имя_пользователя" в случае, если существует хотя бы один зарегистрированный пользователь с именем вида "имя_пользователя@*".
3.4. Администрирование синдикаций средствами админки форума либо средствами отдельной админки.
4. Обсудить меры защиты от несанкционированных рассылок в свете увеличивающейся при синдикации привлекательности объединённых форумов для спамеров.
5. Составить инструкцию по установке и использованию разработанных модулей синдикации, а также краткий F.A.Q.
|
|||||||
|