Firefox에서 http 요청을 시작한 사람을 식별하는 방법은 무엇입니까?


105

나는 새로운 파이어 폭스 애드온을 개발하고 그 절편 모든 파이어 폭스의 네트워크 트래픽 (와 HTTP (S) 요청 http-on-modify-request)

현재 코드를 사용하면 웹 페이지 / 탭 및 기타 모든 구성 요소 (RSS 피드 업데이트, XPCOM 구성 요소의 XHR 요청, 확장, 확장 관리자 등)에서 오는 요청을 분리 할 수 ​​있습니다.

전체 그룹뿐만 아니라 탭의 트래픽 이외의 요청을 시작하는 사람을 정확하게 식별하고 싶습니다. (RSS, XPCOM 구성 요소, 확장, 확장 관리자 등)

예 : 가상 맞춤 변수requestRequestor 에는 특정 애드온 또는 RSS 업데이트 등을 식별하는 값이 있습니다.

이 비슷한 질문을 찾았 지만 해결책이 없습니다.

전체 그룹을 식별하는 현재 코드 ( http-on-modify-request 알림을 실행하는 브라우저 가져 오기 )는 다음과 같습니다.

Components.utils.import('resource://gre/modules/Services.jsm');
Services.obs.addObserver(httpObs, 'http-on-modify-request', false);
//Services.obs.removeObserver(httpObs, 'http-on-modify-request'); //uncomment this line, or run this line when you want to remove the observer

var httpObs = {
    observe: function (aSubject, aTopic, aData) {
        if (aTopic == 'http-on-modify-request') {
            /*start - do not edit here*/
            var oHttp = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); //i used nsIHttpChannel but i guess you can use nsIChannel, im not sure why though
            var interfaceRequestor = oHttp.notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
            //var DOMWindow = interfaceRequestor.getInterface(Components.interfaces.nsIDOMWindow); //not to be done anymore because: https://developer.mozilla.org/en-US/docs/Updating_extensions_for_Firefox_3.5#Getting_a_load_context_from_a_request //instead do the loadContext stuff below
            var loadContext;
            try {
                loadContext = interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);
            } catch (ex) {
                try {
                    loadContext = aSubject.loadGroup.notificationCallbacks.getInterface(Components.interfaces.nsILoadContext);
                    //in ff26 aSubject.loadGroup.notificationCallbacks was null for me, i couldnt find a situation where it wasnt null, but whenever this was null, and i knew a loadContext is supposed to be there, i found that "interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);" worked fine, so im thinking in ff26 it doesnt use aSubject.loadGroup.notificationCallbacks anymore, but im not sure
                } catch (ex2) {
                    loadContext = null;
                    //this is a problem i dont know why it would get here
                }
            }
            /*end do not edit here*/
            /*start - do all your edits below here*/
            var url = oHttp.URI.spec; //can get url without needing loadContext
            if (loadContext) {
                var contentWindow = loadContext.associatedWindow; //this is the HTML window of the page that just loaded
                //aDOMWindow this is the firefox window holding the tab
                var aDOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
                var gBrowser = aDOMWindow.gBrowser; //this is the gBrowser object of the firefox window this tab is in
                var aTab = gBrowser._getTabForContentWindow(contentWindow.top); //this is the clickable tab xul element, the one found in the tab strip of the firefox window, aTab.linkedBrowser is same as browser var above //can stylize tab like aTab.style.backgroundColor = 'blue'; //can stylize the tab like aTab.style.fontColor = 'red';
                var browser = aTab.linkedBrowser; //this is the browser within the tab //this is what the example in the previous section gives
                //end getting other useful stuff
            } else {
                Components.utils.reportError('EXCEPTION: Load Context Not Found!!');
                //this is likely no big deal as the channel proably has no associated window, ie: the channel was loading some resource. but if its an ajax call you may end up here
            }
        }
    }
};

9
와우, 여기에서 환상적인 작업을하셨습니다.이 주제를 보았습니까 : stackoverflow.com/questions/27483651/… 여러분이 기여할 수있는 주제에 더 가깝습니다. 지금까지 소스를 식별하는 방법을보고 싶습니다.
Noitidart

2
귀하의 링크에 감사드립니다. 파이어 폭스 요청 등에 대한 정보가 많을수록 내 애드온이 더 좋을 것입니다.하지만 고급 보안 애드온에서 작업하는 것은 쉽지 않습니다. (애드온이 공개되는 것은 취미 일뿐입니다.) ) GitHub의에 알
intika

1
또한 여기에 loadContextAndGoodies약간의 개선을 사용할 수있는 내가 작성한 함수가 있습니다. 얼마 전에 작성했지만 가능하면 개선하십시오. gist.github.com/Noitidart/… 위 코드에서 해당 스 니펫의 이전 버전을 사용하고있는 것 같습니다. 따라서이 스 니펫을 사용하면 위의 코드가 정리되고 스 니펫에 일부 개선 사항이있을 수 있습니다 (비교하지 않았는지 모르겠습니다. : P)
Noitidart

2
그래, 방금 추가하고 테스트하는 다른 질문에서 코드를 봤습니다;) 필요한 경우 풀 요청을 게시 할 것입니다;)
intika

2
홍보 해 주셔서 감사합니다. 저는 귀하의 홍보에 대해 홍보했습니다. :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart

답변:


1

2020 년 6 월 현재 http 요청 요청자 필터링 / 식별을 달성하는 공식적인 방법 / 방법은 없습니다.

현재 유일한 가능성은 웹 페이지 / 탭과 다른 Firefox의 구성 요소 (피드 업데이트, 확장 요청, XPCOM 구성 요소의 XHR 요청 등)에서 요청을 분리하는 질문 코드에서 수행되는 작업입니다.

주석에서 언급했듯이 이것은 Firefox의 내부 제한입니다. 현재 Firefox의 핵심 코드는 요청자 추적을 구현하지 않으므로 요청을 시작한 사람과 이유를 알 수 없습니다. 최근에 Chrome 개발 도구 에이 기능이 추가 되었다는 사실을 아는 것이 유용 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.