Оригинал - http://debug-mode.in/phpbb.txt в оригинале соблюдается неплохое форматирование =) [PRE] В этой "статье" я бы хотел рассмотреть анализирование работы большого проекта,как например таким является phpBB(в "статье" рассмотрена версия 2.0.18), из-за огромного количества сообщениях на форуме с вопросом "а что собственно я отснифал?"(то есть главный вопрос - "как кодируется и используется сессия в phpBB 2.0.18" ) Никто не смог ответить на этот вопрос.Как мне кажется главная причина-неумение анализировать исходники большого размера, с запутанными "связями" и самим кодом.Поэтому я решил написать что-то типа примера,как нужно анализировать алгоритм работы.Данном случае это шифрование значения сессии в cookie... [Глава первая:Охота на ведьм] Для начала я сразу же помянул "плохим" словом разработчиков phpBB,это прибавило боегого духа так сказать =) Первое что надо сделать,из активных телодвижений это просмотреть исходник.Так как раньше я не имел дела с phpBB,структура форума мне не была знакома(что куда обращается и прочее) Определимся с названиями файлов,так ключевые слова будут "шифрование","сессия(session)","cookie","serialize","unserialize".Многие наверняка зададут вопрос "Откуда взялись последнии ключевые слова?!?" Ответ: да оттуда =) Если вы знакомы с веб програмиированием хотябы отдаленно,то наверняка должны знать,что в куках нельзя хранить объекты,массивы и тп.Поэтому разработчики пхп придумали эти две функции,преобразующие объект(а в данном случае это будет массив) в строку,определенного формата,вторая функция осуществляет обратные преобразования.Ну вопщем тут все понятно.Что бы не использовать поиск по файлам в любимом PSPad'e (txt редактор,имеющий широкие возможности,написан на Delphi) Я решил презадуматься,развить мышление так сказать. Наш алгоритм действий будет такой: 1)Пройдемся по файлам лежащим в папке,но не по всем а только по тем,которые для нас интересны 2)Пройдемся по поддиректориям.(заходим в папку идем на пункт 1.) Вот вы подумайте,сессия должна ставится при login'e значит возможно будет в файле login.php, или index.php Ничего похожего я не нашел в этих файлах, зашел в папочку "/includes/" под мой запрос подошли файлы auth.php,functions.php("наверняка тут основные функции"-,подумал я тогда),sessions.php.В первых двух мало чего интересного, а в sessions.php находилось именно то что я ожидал... [Глава вторая:Засада] Несмотря на то ,что я нашел файл отвечающий за сессии,мне не хватало информации.Пришлось готовится к засаде... Для начала я поискал в других исходниках значение непонятных мне переменных(это мы уже научились делать в главе 1) После того как этот "клубок" связей между файлов,начал раскручиваться,мы должны собрать больше информации. Поставив форум на локалхост,я зашел залогинелся. Смотрим что мне удалось подсмотреть. При заходе и автологине: URL: http://localhost/phpbb2/index.php?sid=8b65afab026290d77d64b86326f89812 Tables: Code: +-------Содержание_таблицы_"phpbb_sessions_keys"-------------+ |key_id |user_id|last_ip |last_login| |47890667360dafa661c2c001881fcd8c| 2|7f000001|1133880510| +------------------------------------------------------------+ +-----Содержание_таблицы_"phpbb_sessions"-------------------------------------------------------------------------------------------+ |session_id |session_user_id|session_start|session_time|session_ip|session_page|session_logged_in|session_admin| |8b65afab026290d77d64b86326f89812| 2| 1133880510| 1133880510| 7f000001| 0| 1| 0| +-----------------------------------------------------------------------------------------------------------------------------------+ Cookie: Code: +----------phpbb2mysql_data-------------------------------------------------------------+ |a:2:{s:11:"autologinid";s:33:"11328591534395a4beaa2249.79604364";s:6:"userid";s:1:"2";}| +---------------------------------------------------------------------------------------+ +--------phpbb2mysql_sid---------+ |8b65afab026290d77d64b86326f89812| +--------------------------------+ То есть cookie phpbb2mysql_data содержит строку, в которой "свернут" массив.Для тех кто не понял напишу: ключ массива: autologinid значение: 11328591534395a4beaa2249.79604364 ключ массива: userid значение:2 [Глава 3: Наш ход] Теперь когда у нас есть все что бы анализировать ситуацию,мы можем глянуть опять в исходник. Незнаю почему, но я все время сначала гляжу на функции удаления(session_clean),мне это помогает сначала,представить что выполняет функция добавления(session_begin) Подчерпнул кое-что о автологине,и о назначении таблиц.Далее я поглядел конечто на функцию session_begin,посмотря на sql запрос многое понимаешь... [Глава 4: Родственные связи...] "Вот оно!",-так и хотелось закричать мне когда моя теория подтвердилась. Смотрим главу вторую,а именно сведения которые мы подчерпнули: autologinid=11328591534395a4beaa2249.79604364 Из исходника следует что key_id=md5(autologinid)! Проверил,и вправду все верно! Вот тебе и первая связь! Связь конечно это хорошо,даже очень хорошо. Но вот что не вписывалось: mt_srand((float) $sec + ((float) $usec * 100000)); $session_id = md5(uniqid(mt_rand(), true)); /*Далее*/ list($sec, $usec) = explode(' ', microtime()); mt_srand(hexdec(substr($session_id, 0, 8)) + (float) $sec + ((float) $usec * 1000000)); $auto_login_key = uniqid(mt_rand(), true); В этой строке индификатору сессии,которая будет записана в таблицу phpbb_sessions,присваевается неповторяющийся md5 хеш,никак не связанный с key_id. Но постойте,этот хеш равен куке phpbb2mysql_sid и равен переменной sid в урле после процедуры логина! Но как бы это связать с хешем пароля?? [Глава 5: Исход битвы] Ответ-никак =) Вопщем этой "статьёй" я хотел показать пример анализирования алгоритма работы большого веб приложения, думаю это мне удалось,остальное не главное для этой "статьи".
Хорошая статья и тема поднятая действительно актуальна, многие не умеют хорошо ориентироваться в чужом исходном коде особенно если это си или пхп с перлом. Нужно иметь алгоритмическое мышление так что люди кто хочет быстро "щупать" код выучите сначала хорошо синтаксис языка, потому что без опыта не куда.
На самом деле те три языка которые ты указал разницы не имеют..Вобще во всех языках не сможеш ореентироваться без его знания... А если речь пошла о ориентации в языках то вообщем самым сложным будет ореентироваться в ассемблере..Так что надо учить язык..И будеш ты ореентироваться во всем
Спасибо за статью. Вообще-то пробовал по твоему совету разобраться в исходнике, но просто неасилил. дело не в лени.
2grinay я их написал как раз в силу схожести синтаксиса=) а ассемблер имхо другая "история" тк он такой один)) все языки я бы разделил на си подобные, паскале подобные и один асм (лисп и прочее я не рассматриваю)- соответственно выучишь си, паскаль и асм тогда и будешь ореентироваться во всем
Типичный случай - программеру трудно соорентироваться в чужом коде. И дело не в том что программер неопытный, просто это процесс ресурсоемкий (в плане человеческих ресурсов) и отнимает много времени. Если код очень большой и написан на одном из обьекто-ориентированных языках (С++/C#/Java/Delphi), то использование CASE средств наподобие Visio или Rational Rose намного облегчают эту задачу.