Статьи Основы анализирования алгоритмов работы веб-приложений

Discussion in 'Статьи' started by qBiN, 6 Dec 2005.

  1. qBiN

    qBiN Вот такой вот я :(

    Joined:
    20 Jan 2005
    Messages:
    834
    Likes Received:
    73
    Reputations:
    33
    Оригинал - 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: Исход битвы]
    Ответ-никак =)
    Вопщем этой "статьёй" я хотел показать пример анализирования алгоритма работы большого веб приложения,
    думаю это мне удалось,остальное не главное для этой "статьи".
     
    #1 qBiN, 6 Dec 2005
    Last edited: 6 Dec 2005
    6 people like this.
  2. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    Хорошая статья и тема поднятая действительно актуальна, многие не умеют хорошо ориентироваться в чужом исходном коде особенно если это си или пхп с перлом. Нужно иметь алгоритмическое мышление так что люди кто хочет быстро "щупать" код выучите сначала хорошо синтаксис языка, потому что без опыта не куда.
     
  3. grinay

    grinay IQ- 137%

    Joined:
    15 Jun 2004
    Messages:
    409
    Likes Received:
    174
    Reputations:
    305
    На самом деле те три языка которые ты указал разницы не имеют..Вобще во всех языках не сможеш ореентироваться без его знания... А если речь пошла о ориентации в языках то вообщем самым сложным будет ореентироваться в ассемблере..Так что надо учить язык..И будеш ты ореентироваться во всем:)
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    728
    Reputations:
    266
    не прав, это отмазка.
    причина в лени.
     
  5. qBiN

    qBiN Вот такой вот я :(

    Joined:
    20 Jan 2005
    Messages:
    834
    Likes Received:
    73
    Reputations:
    33
    Некоторые действительно не умеют =)
    Побольшей части да =)
     
  6. syntacsis

    syntacsis Elder - Старейшина

    Joined:
    14 Nov 2005
    Messages:
    78
    Likes Received:
    31
    Reputations:
    6
    Спасибо за статью.
    Вообще-то пробовал по твоему совету разобраться в исходнике, но просто неасилил. дело не в лени.
     
  7. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2grinay я их написал как раз в силу схожести синтаксиса=) а ассемблер имхо другая "история" тк он такой один)) все языки я бы разделил на си подобные, паскале подобные и один асм (лисп и прочее я не рассматриваю)- соответственно выучишь си, паскаль и асм тогда и будешь ореентироваться во всем
     
  8. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    ассемблер тот редкий случай, когда он не один
     
  9. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Типичный случай - программеру трудно соорентироваться в чужом коде. И дело не в том что программер неопытный, просто это процесс ресурсоемкий (в плане человеческих ресурсов) и отнимает много времени.

    Если код очень большой и написан на одном из обьекто-ориентированных языках (С++/C#/Java/Delphi), то использование CASE средств наподобие Visio или Rational Rose намного облегчают эту задачу.
     
    #9 Deem3n®, 9 Dec 2005
    Last edited by a moderator: 9 Dec 2005
  10. Nova

    Nova Green member

    Joined:
    15 Jul 2005
    Messages:
    1,233
    Likes Received:
    423
    Reputations:
    280
    Да неплохая статья действительно думаю многим поможет ориентироваться в чужом коде...
     
    _________________________