Nano Hash - криптовалюты, майнинг, программирование

Как надежно классифицировать сеансы HTTP в прокси для соответствующих окон/вкладок браузера, которые просматривает пользователь?

Я использовал основную библиотеку .NET Fiddler в качестве локального прокси-сервера для записи активности пользователя в Интернете. Тем не менее, я столкнулся с проблемой, которую кажется грязной решить. У меня есть веб-браузер, скажем, Google Chrome, и пользователь открыл около 10 разных вкладок, каждая с разными веб-адресами. Проблема в том, что прокси-сервер записывает все HTTP-сессии, инициированные каждой страницей отдельно, в результате чего я с помощью своего интеллекта выясняю, к какой вкладке принадлежала соответствующая HTTP-сессия. Я понимаю, что это из-за того, что протокол HTTP не имеет состояния. Однако мне просто интересно, есть ли простой способ сделать это? В итоге я получил приведенный ниже код С# для этого в Fiddler. Тем не менее, это не надежное решение.

Это модификация примера проекта, связанного с ядром Fiddler для .NET 4. По сути, он фильтрует сеансы HTTP, инициированные за последние несколько секунд, чтобы найти первый запрос или переключиться на другую страницу, сделанную на той же вкладке в браузере. Это почти работает, но не кажется универсальным решением.

 Fiddler.FiddlerApplication.AfterSessionComplete += delegate(Fiddler.Session oS)
        {
            //exclude other HTTP methods
            if (oS.oRequest.headers.HTTPMethod == "GET" || oS.oRequest.headers.HTTPMethod == "POST")
                //exclude other HTTP Status codes
                if (oS.oResponse.headers.HTTPResponseStatus == "200 OK" || oS.oResponse.headers.HTTPResponseStatus == "304 Not Modified")
                {
                    //exclude other MIME responses (allow only text/html)
                    var accept = oS.oRequest.headers.FindAll("Accept");

                    if (accept != null)
                    {
                        if(accept.Count>0)  
                        if (accept[0].Value.Contains("text/html"))
                        {

                            //exclude AJAX
                            if (!oS.oRequest.headers.Exists("X-Requested-With")) 
                            {
                                //find the referer for this request
                                  var referer = oS.oRequest.headers.FindAll("Referer");
                                //if no referer then assume this as a new request and display the same 
                                if(referer!=null)
                                {
                                    //if no referer then assume this as a new request and display the same 
                                    if (referer.Count > 0)
                                    {
                                        //lock the sessions
                                        Monitor.Enter(oAllSessions);

                                       //filter further using the response
                                        if (oS.oResponse.MIMEType == string.Empty || oS.oResponse.MIMEType == "text/html")

                                            //get all previous sessions with the same process ID this session request
                                        if(oAllSessions.FindAll(a=>a.LocalProcessID == oS.LocalProcessID)
                                            //get all previous sessions within last second (assuming the new tab opened initiated multiple sessions other than parent)
                                            .FindAll(z => (z.Timers.ClientBeginRequest > oS.Timers.ClientBeginRequest.AddSeconds(-1)))
                                            //get all previous sessions that belongs to the same port of the current session
                                            .FindAll(b=>b.port == oS.port ).FindAll(c=>c.clientIP ==oS.clientIP)
                                            //get all previus sessions with the same referrer URL of the current session
                                            .FindAll(y => referer[0].Value.Equals(y.fullUrl))
                                            //get all previous sessions with the same host name of the current session
                                            .FindAll(m=>m.hostname==oS.hostname).Count==0 ) //if count ==0 that means this is the parent request
                                                 Console.WriteLine(oS.fullUrl);

                                        //unlock sessions
                                        Monitor.Exit(oAllSessions);
                                    }
                                    else
                                        Console.WriteLine(oS.fullUrl);

                                }
                                else
                                    Console.WriteLine(oS.fullUrl);

                                Console.WriteLine(); 

                            }
                        }
                    }
                }

        };

Ответы:


1

Нет никакого способа сделать это с идеальной точностью. Все, что видит прокси-сервер, — это данные HTTP, которые не содержат никакой информации о том, какая вкладка или процесс были источником запроса (хотя заголовок HTTP Referer может помочь. В IE вы можете включить заголовок X-Download-Initiator, который поможет еще больше. )

Но в целом, как вы уже поняли, вы можете делать обоснованные предположения, если знаете что-то о типах страниц, с которыми имеете дело, но это лучшее, что вы можете сделать.

27.06.2013
  • Так что нет надежного способа. Думаю, я бы использовал некоторые эвристики для повышения точности. Жду других лучших ответов, если бы не я, я бы отметил это как принятое. Спасибо. 27.06.2013

  • 2

    Существует обходной путь, чтобы сделать это путем внедрения скрипта. По сути, мы должны отправлять java-скрипт с каждым HTTP-ответом, отправленным в браузер, который, в свою очередь, отправляет значение window.URL обратно на прокси-сервер с помощью HTTP-запроса.

    10.07.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..