![]() |
Основы анализирования алгоритмов работы веб-приложений
Оригинал - http://debug-mode.in/phpbb.txt в оригинале соблюдается неплохое форматирование =)
[PRE] В этой "статье" я бы хотел рассмотреть анализирование работы большого проекта,как например таким является phpBB(в "статье" рассмотрена версия 2.0.18), из-за огромного количества сообщениях на форуме с вопросом "а что собственно я отснифал?"(то есть главный вопрос - "как кодируется и используется сессия в phpBB 2.0.18" ) Никто не смог ответить на этот вопрос.Как мне кажется главная причина-неумение анализировать исходники большого размера, с запутанными "связями" и самим кодом.Поэтому я решил написать что-то типа примера,как нужно анализировать алгоритм работы.Данном случае это шифрование значения сессии в cookie... [Глава первая:Охота на ведьм] Для начала я сразу же помянул "плохим" словом разработчиков phpBB,это прибавило боегого духа так сказать =) Первое что надо сделать,из активных телодвижений это просмотреть исходник.Так как раньше я не имел дела с phpBB,структура форума мне не была знакома(что куда обращается и прочее) Определимся с названиями файлов,так ключевые слова будут "шифрование","сессия(session)","co okie","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?si...64b86326f89812 Tables: Код:
+-------Содержание_таблицы_"phpbb_sessions_keys"-------------+Код:
+----------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 намного облегчают эту задачу. |
Да неплохая статья действительно думаю многим поможет ориентироваться в чужом коде...
|
| Время: 01:14 |