0

我使用 Fiddler 核心 .NET 库作为本地代理来记录网络中的用户活动。但是,我最终遇到了一个似乎很难解决的问题。我有一个网络浏览器,比如谷歌浏览器,用户打开了 10 个不同的标签,每个标签都有不同的网址。问题是代理记录了每个页面发起的所有HTTP会话,导致我用我的智能找出相应的HTTP会话所属的选项卡。我知道这是因为 HTTP 协议的无状态特性。但是,我只是想知道是否有一种简单的方法可以做到这一点?我最终在 Fiddler 中得到了下面的 c# 代码。不过,这不是一个可靠的解决方案。

这是对 .NET 4 的 Fiddler 核心捆绑的示例项目的修改。基本上它的作用是过滤在最后几秒钟内启动的 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(); 

                            }
                        }
                    }
                }

        };
4

2 回答 2

2

没有办法以完美的准确性做到这一点。代理看到的只是 HTTP 数据,其中不包含有关哪个选项卡或进程是请求源的任何信息(尽管 HTTPReferer标头可能会有所帮助。在 IE 中,您可以启用X-Download-Initiator标头,这将更有帮助。)

但通常,正如您所发现的,如果您对所处理的页面类型有所了解,您可以做出明智的猜测,但这是您能做的最好的事情。

于 2013-06-27T18:46:49.550 回答
0

有一个解决方法可以通过脚本注入来做到这一点。基本上,我们必须发送一个 java 脚本,将每个 HTTP 响应发送到浏览器,然后浏览器通过 HTTP 请求将 window.URL 值发送回代理。

于 2013-07-10T02:05:14.363 回答