จะระบุได้อย่างไรว่าใครเป็นผู้ริเริ่มคำขอ http ใน Firefox


105

ฉันกำลังพัฒนา addon Firefox ใหม่ที่สกัดกั้นการจราจรเครือข่ายของ Firefox (http (s) คำขอhttp-on-modify-request)

ด้วยรหัสปัจจุบันของฉันฉันสามารถแยกคำขอที่มาจากหน้าเว็บ / แท็บและส่วนประกอบอื่น ๆ ทั้งหมด (การอัปเดตฟีด RSS คำขอ XHR จากคอมโพเนนต์ XPCOM ส่วนขยายตัวจัดการส่วนขยาย ฯลฯ )

ฉันต้องการระบุว่าใครเป็นผู้เริ่มต้นคำขอนอกเหนือจากการเข้าชมของแท็บด้วยความแม่นยำไม่ใช่แค่ทั้งกลุ่ม (RSS ส่วนประกอบ XPCOM ส่วนขยายตัวจัดการส่วนขยาย ฯลฯ )

ตัวอย่าง:ตัวแปรที่กำหนดเองสมมุติrequestRequestorจะมีค่าเพื่อระบุ addon เฉพาะหรืออัพเดต RSS เป็นต้น

ฉันพบคำถามที่คล้ายกันนี้แต่ไม่มีทางแก้ไข

รหัสปัจจุบันเพื่อระบุทั้งกลุ่ม ( รับเบราว์เซอร์ที่เริ่มการแจ้งเตือน http-on-modified-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
ขอบคุณสำหรับลิงค์ของคุณข้อมูลเพิ่มเติมที่ฉันมีเกี่ยวกับคำขอ firefox เป็นต้นยิ่ง addon ของฉันจะดีขึ้นการทำงานกับส่วนเสริมความปลอดภัยขั้นสูงไม่ใช่เรื่องง่าย (เป็นเพียงงานอดิเรกที่ addon จะเผยแพร่สู่สาธารณะ) ฉันจะปล่อยให้คุณ รู้ใน github)
intika

1
นี่คือloadContextAndGoodiesฟังก์ชั่นที่ฉันเขียนซึ่งสามารถใช้การปรับปรุงบางอย่างได้ฉันเขียนไว้เมื่อสักครู่ที่ผ่านมา แต่โปรดปรับปรุงถ้าเป็นไปได้ gist.github.com/Noitidart/…ดูเหมือนว่าคุณจะใช้ข้อมูลโค้ดรุ่นเก่ากว่าในโค้ดของคุณด้านบนดังนั้นการใช้ข้อมูลโค้ดนี้จะเป็นการล้างโค้ดด้านบนและข้อมูลโค้ดอาจมีการปรับปรุงบางอย่าง (ฉันไม่รู้ว่าฉันไม่ได้เปรียบเทียบ : P)
Noitidart

2
ใช่ฉันเห็นรหัสของคุณในคำถามอื่นที่เพิ่งเพิ่มและทดสอบ;) จะโพสต์คำขอดึงหากจำเป็น;)
intika

2
ขอบคุณสำหรับการประชาสัมพันธ์ฉันทำ pr ใน pr ของคุณ :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart

คำตอบ:


1

ณ เดือนมิถุนายน 2020 ไม่มีวิธีการอย่างเป็นทางการในการบรรลุการกรอง / การระบุผู้ร้องขอคำขอ http

ขณะนี้ความเป็นไปได้เดียวคือสิ่งที่ทำกับโค้ดของคำถามซึ่งแยกคำขอออกจากหน้าเว็บ / แท็บและส่วนประกอบอื่น ๆ ของ Firefox (การอัปเดตฟีดคำขอส่วนขยายคำขอ XHR จากส่วนประกอบ XPCOM ฯลฯ )

ดังที่ได้กล่าวไว้ในความคิดเห็นนี้เป็นข้อ จำกัด ภายในของ Firefox รหัสหลักของ Firefox ในปัจจุบันไม่ได้ใช้การติดตามผู้ร้องขอดังนั้นจึงไม่ทราบว่าใครเป็นผู้เริ่มต้นคำขอและเหตุใด อาจเป็นประโยชน์หากทราบว่าเครื่องมือ Chrome dev เพิ่งมีคุณลักษณะนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.