41.0b1 +에서 확인되지 않은 파이어 폭스 확장 프로그램을 강제 설치하는 방법은 무엇입니까?


15

Firefox (41.0b1)의 최신 업데이트는 확인되지 않은 확장 프로그램 ( HTTPS EverywherePrivacy Badger )의 설치를 적극적으로 차단합니다 .

이러한 확장을 강제로 설치하려면 어떻게해야합니까? 내부 설정 거기에 about:config내가 일시적으로 전환 할 수는?

Mozilla는 악성 익스텐션의 상관 관계를 비효율적으로 만들기위한 이전의 노력을 언급하면서 Firefox의 이러한 변경 사항을 여기서 강조합니다 .

답변:


19

예,에 설정이 About:config있으며 이름은 xpinstall.signatures.required입니다. 환경 설정 이름을 두 번 클릭하여 값이 false로 설정되도록하십시오. 이제 Firefox에서 서명되지 않은 확장을 설치할 수 있습니다. 브라우저를 다시 시작할 필요가 없습니다.


2
환상적인! 이 수정은 EFF 및 다른 확장이 확인 될 때까지 충분합니다.
VitaminYes

1
버전 43+ 이후에는 작동하지 않습니다. :(
Suresh Atta

많은 출처에서 최근 FF에서 작동하지 않는다고 말했지만 Linux에서는 48.0에서 효과적이었습니다. 애드온 페이지를 열고 xpi 파일을 드래그해야했습니다.
그 브라질 사람

@ThatBrazilianGato : Win7 FF48.0에서 나를 위해 작동하지 않습니다 :(
glavić

4
그게 다야. 안녕 파이어 폭스, 0.6 이후로 당신을 사랑했다. :-( 언젠가 해결 방법이 있기를 바랍니다.
andreas

2

Firefox 48 이상에서는이 방법이 작동하지 않습니다. 대신 Firefox 디렉토리 내에 두 개의 구성 파일을 작성해야합니다.

  1. 메모장에서 config.js 파일을 작성 하십시오 (파일 확장자가 .txt가 아닌 .js 인지 확인하십시오 ).

    //
    try {
    Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
    .eval("SIGNED_TYPES.clear()");
    }
    catch(ex) {}
    
  2. config.js 를 Firefox 설치 디렉토리로 이동 하십시오.

    Windows : C : \ Program Files \ Mozilla Firefox
    (또는 C : \ Program Files (x86) \ Mozilla Firefox )

    Linux : / usr / lib64 / firefox- <version>
    (또는 / usr / lib / firefox- <version>)

    맥 : /Applications/Firefox.app

  3. 메모장에서 config-prefs.js 를 만듭니다 .

    pref("general.config.obscure_value", 0);
    pref("general.config.filename", "config.js");
    
  4. config-prefs.js 를 Firefox defaults \ pref 디렉토리 로 이동 하십시오 .
    (예 : C : \ Program Files \ Mozilla Firefox \ defaults \ pref )

  5. Firefox를 다시 시작하십시오.

  6. 서명되지 않은 XPI를 Firefox 창으로 끌어 오거나 Firefox 추가 기능의 설정에서 "파일에서 추가 기능 설치"옵션을 사용하십시오.


출처 : https://forum.mozilla-russia.org/viewtopic.php?id=70326


불행히도이 방법은 FF 66.0.3 64 비트에서는 작동하지 않는 것 같습니다. 모질라가 큰 시간을 허비했던 것은 이제 절실히 필요했을 것입니다.
CoolKoon

1

분명히 Firefox 60 이상에서는 위에서 설명한 config.js 트릭 xpinstall.signatures.required도 작동 하지 않습니다 (Mozilla, keel over please!).

위에서 언급 한 러시아 포럼은 분명히 이러한 버전의 Firefox에 대한 솔루션을 언급합니다. 그래서이 점을 넣어 config.js 당신이 다음에 저장하는 대신 C : \ 프로그램 파일 \ 모질라 파이어 폭스를

//
try {(code => {
    var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
    var jsval, evl = true, re = e => Cu.reportError(e), imp = name => {try {
        return Cu.import(`resource://gre/modules/addons/${name}.jsm`, {});
    } catch(ex) {}}
    if ((jsval = imp("AddonSettings"))) {
        jsval.AddonSettings = {ADDON_SIGNING: false, REQUIRE_SIGNING: false, ALLOW_LEGACY_EXTENSIONS: true};
        try {evl = jsval.eval("this") === jsval;} catch(ex) {evl = false;}
    }
    var jsvals = ["XPIProvider", "XPIInstall"].map(imp).filter(i => i);
    jsvals[0].AddonSettings && lockPref("extensions.allow-non-mpc-extensions", true);
    jsvals[0].signaturesNotRequired = true;

    if (evl) return jsvals.forEach(jsval => {try {jsval.eval(code);} catch(ex) {re(ex);}});

    var sl = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader);
    Cu.importGlobalProperties(["URL", "Blob"]); var url = URL.createObjectURL(new Blob([(code)]));
    jsvals.forEach(jsval => {try {sl.loadSubScript(url, jsval);} catch(ex) {re(ex);}});

})(String.raw`((vzss, pckg) => {
    var trueDesc = {enumerable: true, value: true};
    typeof Extension == "function" && Object.defineProperty(Extension.prototype, "experimentsAllowed", trueDesc);
    "AddonInternal" in this && Object.defineProperty(AddonInternal.prototype, "providesUpdatesSecurely", trueDesc);
    this.isDisabledLegacy = () => false;
    if ("XPIDatabase" in this) this.XPIDatabase.isDisabledLegacy = () => false;
    try {SIGNED_TYPES.clear();} catch(ex) {};

    if (!vzss && !pckg) return;

    var re = /\x06\x03U\x04\x03..(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)0\x82\x02"0\r\x06\t/i;
    var getUUID = () => {
        var gen = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
        return (getUUID = () => gen.generateUUID().toString())();
    }
    var getIdFromString = str => {
        var match = str && str.match(re);
        return match ? match[1] : getUUID();
    }
    var getState = arg => ({
        signedState: AddonManager.SIGNEDSTATE_NOT_REQUIRED,
        cert: typeof arg == "object" ? arg : {commonName: arg}
    });
    var checkAddon = addon => {
        if (addon.id || (
            "_installLocation" in addon
                ? addon._installLocation.name == KEY_APP_TEMPORARY
                : addon.location.isTemporary
        ))
            return getState(null);
    }
    var getRoot = () =>
        !AppConstants.MOZ_REQUIRE_SIGNING && Services.prefs.getBoolPref(PREF_XPI_SIGNATURES_DEV_ROOT, false)
            ? Ci.nsIX509CertDB.AddonsStageRoot : Ci.nsIX509CertDB.AddonsPublicRoot;

    if (vzss) {
        var getURI = file => {
            var jsval = Cu.import("resource://gre/modules/addons/XPIProvider.jsm", {});
            return (getURI = file => jsval.getURIForResourceInFile(file, "META-INF/mozilla.rsa"))(file);
        }
        var getIdFromFile = file => {
            var str, is = {close() {}}, sis = {close() {}};
            try {
                is = Services.io.newChannelFromURIWithLoadInfo(getURI(file), null).open();
                sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
                sis.init(is);
                str = sis.readBytes(sis.available());
            } catch(ex) {}
            sis.close(); is.close();
            return getIdFromString(str);
        }
        this.verifyZipSignedState = function verifyZipSignedState(aFile, aAddon) {
            var res = checkAddon(aAddon);
            return res ? Promise.resolve(res) : new Promise(resolve => {
                var callback = {openSignedAppFileFinished(rv, zipReader, cert) {
                    zipReader && zipReader.close();
                    resolve(getState(cert || getIdFromFile(aFile)));
                }};
                gCertDB.openSignedAppFileAsync(getRoot(), aFile, callback.wrappedJSObject = callback);
            });
        }
    }

    if (pckg) Package.prototype.verifySignedState = function verifySignedState(addon) {
        var res = checkAddon(addon);
        return res ? Promise.resolve(res) : new Promise(resolve =>
            this.verifySignedStateForRoot(addon, getRoot()).then(({cert}) => {
                if (cert)
                    resolve(getState(cert));
                else
                    this.readBinary("META-INF", "mozilla.rsa").then(
                        buffer => resolve(getState(
                            getIdFromString(String.fromCharCode(...new Uint8Array(buffer)))
                        )),
                        () => resolve(getState(getUUID()))
                    );
            }, Cu.reportError)
        );
    }
})(
    "verifyZipSignedState" in this, typeof Package == "function"
);`)} catch(err) {
    err.message != "Components is not defined" && Components.utils.reportError(err);
}

그런 다음 C : \ Program Files \ Mozilla Firefox \ defaults \ pref에 저장된 config-prefs.js 파일 에 추가해야합니다.

pref("general.config.obscure_value", 0);
pref("general.config.filename", "config.js");
pref("general.config.sandbox_enabled", false);

FF 66.0.3에서 작동하도록 테스트되었습니다. 불행히도 애드온과 테마를 마술처럼 되돌릴 수는 없지만 적어도 다시 설치하는 옵션을 다시 활성화합니다. 모질라가 포럼에이 문제에 대한 불만이 쇄도하고 있음에도 불구하고 특히 신경 쓰지 않는 것처럼 보이기 때문에 모질라가 제공하는 것보다 낫습니다.


이걸 정말로 원한다면 임의의 핵을 설치하지 말고 signatures.required 환경 설정 문자열이 실제로 활성화되어있는 Nightly를 사용하십시오.
Félix Saparelli

1
왜 내가해야합니까? 지금까지 필자는 Firefox의 공식 애드온 사이트에서 합법적이고 진정한 애드온 만 설치 한 FF의 안정적인 버전이라고 생각한 것을 사용하여 완전히 괜찮 았습니다. 그리고 이제이 모든 애드온 (및 그리스도를 위해 테마!)이 갑자기 작동을 멈췄습니다. 죄송하지만 잠재적으로 더 손상된 FF 버전을 설치하는 대신 현재 설치가 작동하는 것을 선호합니다.
CoolKoon

추신 : 애드온이 내 전화에서 실행되는 Android 버전 FF (v66.0.2)에서 작동을 멈췄지만 흥미롭게도 xpinstall.signatures.required여전히 작동합니다.
CoolKoon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.