检测浏览器是否正在使用专用浏览模式


68

我正在为公司对安全性的偏执建立一个Extranet。他们希望确保(除其他事项外)用户在其Web浏览器中打开了“私人浏览”模式的情况下浏览该网站,以便不保留任何cookie或历史记录。

我只找到了这个 http://jeremiahgrossman.blogspot.com/2009/03/detecting-private-browsing-mode.html/server/18966/force-safari-to-operate-in-私人模式并从网络服务器检测到该状态

理想的解决方案是不使用JavaScript或使用最少的javascript。尝试为所有浏览器和平台设置唯一的cookie是否可行?有人做过吗?

谢谢!


更新

http://crypto.stanford.edu/~collinj/research/incognito/使用其他张贴者提到的浏览器指纹识别器的CSS访问技术-感谢您的提示。

我喜欢它,因为它很小巧且优雅,但是仍然希望能够在不使用JavaScript的情况下做到这一点。


4
缺少javascript支持并不是使用“私人浏览”的良好指示。有许多原因可能会禁用Javascript,其中最重要的原因是使用NoScript。
托马斯(Thomas)

3
@托马斯-那不是他的意思。链接描述了一种方法,该方法要求Javascript检查锚点的样式以测试私有模式是否打开。
艾里克森(Erickson)2010年

您是否只是想记录此信息,还是希望由于私人浏览器检测而发生某些事情?(如果是,是什么?)
詹姆斯

1
@erickson-除了尝试检查是否缺少Javascript或禁用了Javascript外,由于脚本嗅探器和阻止器(例如NoScirpt)以及使用Private浏览器的实现在浏览器之间是不同的。
汤玛斯(Thomas)2010年

@JP:我想在登录后显示一个消息框,建议(其他方式)打开私人浏览功能,以帮助确保网站内容的安全。
史蒂夫2010年

Answers:


57

2019年6月更新

Google取消了从Chrome 76开始永久检测“私人浏览模式”的功能。因此,如果您想检测私人浏览,那么现在是不可能的(除非您找到了Google找不到的方法)。检测私人浏览模式的功能已被确认为错误,并且从未打算这样做。

对于遇到此问题的其他任何人,请注意,自2014年起,尚没有可靠或准确的方法来检测某人是否通过Javascript或CSS以隐身/私有/安全浏览模式进行浏览。此后,曾经像CSS历史记录黑客一样起作用的以前的解决方案已被所有浏览器供应商都不使用。

永远不会有需要在正常的日常网站上检测私有浏览模式的情况。人们出于自身原因选择匿名浏览和/或匿名浏览。

Chrome和Firefox等浏览器不再禁用localStorage等功能。他们只是在一个临时位置为其命名空间,以防止使用它的网站出错。浏览完成后,将删除名称空间,并且不会保存任何内容。如果要测试localStorage支持(无论采用哪种模式),则对于支持它的浏览器,它将始终返回true。

在Chrome中检测专用模式的其他方法已经完全修补,将不再起作用。

如果公司内部需要它,则应开发一个浏览器插件。尤其是Chrome和Firefox,公开了内部API,这些API允许插件检查用户是否处于私有浏览/隐身模式下并采取相应措施。不能在插件之外完成。


41
There should never be a situation where needing to detect private browsing mode 并非完全正确,苹果存在问题:stackoverflow.com/questions/21159301/…在此最好通知客户端它将无法在私有模式下工作。
Pogrindis

4
哦,还有情况下,相信我。例如,如果您以Cookie登录,则WordPress将存储。关闭私有模式选项卡或窗口时,这些将被销毁。在当前的一种情况下,我们遇到的问题是,人们一直在抱怨他们必须一次又一次地登录,因为Safari私有模式基础窗口无法解释Cookies会发生什么。他们只是认为“历史不会被保存”,并相信这将有助于使他们的事情保密。
kaiser 2015年

20
“永远不会有需要在正常的日常网站上检测私人浏览模式的情况”-实际上,这是一个例子。我们正在一个网站上提供暴力侵害妇女的资源。作为该站点的一部分,我们想教育那些不在私有模式下浏览的用户有关他们需要使用私有模式以确保该站点访问不在其历史记录中的事实。我想检测用户是否不处于私有模式,如果是这种情况,请提供有关如何清除最近的缓存并以私有模式返回的适当说明。
法肯教授

5
我们有多个用户没有意识到他们处于私人浏览模式,并认为我们的网站存在问题。我完全不同意您的假设,即无需检测到这一点。
格雷厄姆

5
纽约时报现在正在其网站上执行此验证,并要求您登录或创建帐户。以前(大约一周前),如果您达到了“免费文章”的限制,则可以以隐身模式加载网站并阅读所有内容。我想他们流行了!它还反驳了您的说法,即永远不会有用于检测私有浏览模式的用例。
Matt K

40

这是一种检测隐私模式的简便方法。仅在Safari中有效。我创建它是因为我正在开发的Web应用程序使用localStorage。处于隐私模式时,Safari无法使用LocalStorage,因此我的应用无法正常工作。在页面加载时,运行以下脚本。如果我们不能使用localStorage,它将显示一个警告框。

try {
  // try to use localStorage
  localStorage.test = 2;        
} catch (e) {
  // there was an error so...
  alert('You are in Privacy Mode\nPlease deactivate Privacy Mode and then reload the page.');
}

也许还添加localStorage.test = null; 这样就不会污染其他浏览器的存储空间吗?
克里斯·瑞恩(ChrisWren)'16

@PaulAnnekov是,正如答案中所述,这仅适用于Safari浏览器
Ithar,2016年

@ChrisWren每个浏览器都有自己的本地存储。他们不分享。
戴夫·怀特

谢谢,这解释了一些网站如何检测到这一点。我发现一个网站可以弄清楚这一点非常令人毛骨悚然...(注意,这是在Firefox 55中。)
Luc

3
这仅是由于Safari中的错误所致,而该错误已从iOS 11开始修复
-proxiblue

25

当前状态

使用隐身模式时,谷歌浏览器得到了进一步的发展,并且没有更多的检测空间。其他浏览器可能也是如此。


旧的解决方案(可能会部分起作用)

可以为大多数使用的浏览器检测已启用的私有浏览模式。这包括Safari,Firefox,IE10,Edge和Google Chrome。


火狐浏览器

启用Firefox的私有浏览模式后,IndexedDB会引发InvalidStateError,因为它在私有浏览模式下不可用。

非常要的是:

var db = indexedDB.open("test");
db.onerror = function(){/*Firefox PB enabled*/};
db.onsuccess =function(){/*Not enabled*/};

苹果浏览器

对于Safari,关键是本地存储服务。在隐私模式下将其禁用。因此,请尝试访问它并使用try-catch子句。以下方法适用于OSX和iOS设备。此方法的功劳将用于此问题和解答

var storage = window.sessionStorage;
try {
    storage.setItem("someKeyHere", "test");
    storage.removeItem("someKeyHere");
} catch (e) {
    if (e.code === DOMException.QUOTA_EXCEEDED_ERR && storage.length === 0) {
        //Private here
    }
}

IE10 / Edge

在隐私模式下,Internet Explorer甚至将禁用IndexedDB。因此,检查是否存在。但这还不够,因为较旧的浏览器甚至可能没有IDB。因此,请执行另一项检查,例如,仅IE10和后续浏览器具有/触发的事件。可以在这里找到有关CodeReview的相关问题

if(!window.indexedDB && (window.PointerEvent || window.MSPointerEvent)){
 //Privacy Mode
}

更新:自Chrome 76起,此方法不起作用(感谢@jLynx)

文件系统可以验证Chrome无痕模式。一个很好的解释可以在这里找到

var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
    console.log("FS check failed..");
    return;
}

fs(window.TEMPORARY, 100, function (fs) {}, function (err) {
//Incognito mode
});

Safari不再对我有用(11.1.2),但引用的SO问题得到了一个新答案,对我有用
雷司令

1
纽约时报网站可以检测到以隐身模式运行的Chrome 80,因此除此之外还有其他功能。
斯科特·马丁

Vanity Fair会检测到Chrome Incognito和Firefox隐私模式。您选择了一篇文章,然后开始滚动,几秒钟后,它会弹出“您处于隐私模式,请停止它”消息。
gman

17

Chrome 83附带了重新设计的安全设置,默认情况下,隐身版中阻止了第三方Cookie!

因此,这很容易,创建一个iframe到第三方站点,让它发送postMessage回通知您navigator.cookieEnabled是真还是假。Ofc用户还可以选择禁用第三方cookie。因此,我在设置中测试并禁用了第三方Cookie。但它仍然说,已使用启用了第三方iframe的cookie navigator.cookieEnabled。它只有在我使用隐身模式后才被禁用-也许是错误?

new Promise((rs, rj, m = new MessageChannel(), d = document, i = d.createElement('iframe')) => {
  i.src = 'https://httpbin.org/base64/PHNjcmlwdD5vbm1lc3NhZ2UgPSBlID0+IGUuZGF0YS5wb3N0TWVzc2FnZShuYXZpZ2F0b3IuY29va2llRW5hYmxlZCk8L3NjcmlwdD4='
  i.onload = _ => i.contentWindow.postMessage(m.port1, '*', [m.port1], m.port2.onmessage = e => i.remove(rs(e.data)))
  i.hidden = 1
  d.body.append(i)
}).then(thirdPartyCookieEabled => 
  console.log('Third party cookie enabled:', thirdPartyCookieEabled)
)

您可能还可以仅使用js + ajax来执行此操作,但又不想设置2个服务器自己进行测试。但与此同时,SameSite = none也不必设置。

res = await fetch('https://httpbin.org/cookies/set?enabled=1', {
  credentials: 'include' 
})
json = await res.json()
console.log(!!json.cookies.enabled)

这是我对检测私有模式的看法

function detectPrivateMode(cb) {
    var db,
    on = cb.bind(null, true),
    off = cb.bind(null, false)

    function tryls() {
        try {
            localStorage.length ? off() : (localStorage.x = 1, localStorage.removeItem("x"), off());
        } catch (e) {
            // Safari only enables cookie in private mode
            // if cookie is disabled then all client side storage is disabled
            // if all client side storage is disabled, then there is no point
            // in using private mode
            navigator.cookieEnabled ? on() : off();
        }
    }

    // Blink (chrome & opera)
    window.webkitRequestFileSystem ? webkitRequestFileSystem(0, 0, off, on)
    // FF
    : "MozAppearance" in document.documentElement.style ? (db = indexedDB.open("test"), db.onerror = on, db.onsuccess = off)
    // Safari
    : /constructor/i.test(window.HTMLElement) || window.safari ? tryls()
    // IE10+ & edge
    : !window.indexedDB && (window.PointerEvent || window.MSPointerEvent) ? on()
    // Rest
    : off()
}

detectPrivateMode(function (isPrivateMode) {
    console.log('is private mode: ' + isPrivateMode)
})

编辑发现了一种现代,更快,同步的方法可以在firefox中尝试(他们没有服务工作者处于privat模式),类似于不包含indexedDB,但是该测试仅在安全站点中有效

: "MozAppearance" in document.documentElement.style ? navigator.serviceWorker ? off() : on()

2
注意:IE10或11本身不支持Promises。我假设您在这里使用了polyfill? caniuse.com/#search=promise
Kevin Dice,

@kevinDice我将其更改为简单的回调
无尽的

存在一个用于检测浏览模式的库:github.com/Maykonn/js-detect-incognito-private-browsing-paywall
Maykonn

14

绝对不能肯定,您的网页无法知道用户处于私人浏览模式。随着安全性实施方式的更新,检查各种浏览器功能的任何尝试都需要经常更改。在某些浏览器中,它可能会工作一段时间,但并非全部。

如果公司担心安全性问题,建议您使用锁定的隐私设置来滚动自己的Firefox或Chromium发行版,并仅允许该自定义客户端连接到Extranet。


2
有什么佐证?不会告诉您是否开启私人浏览的“指纹”?该公司“对安全性抱有偏执”,因此仅依靠所谓的指纹是不够的。
Matt S

嗯...我自己的跨平台FF发行?那有点费劲...您知道80%的解决方案吗?(例如80%的时间我们可以猜测用户是否处于私人浏览模式)。我希望将一些安全建议合并到访问者中:使用私有浏览是其中之一。正如其他人所建议的那样,并不是所有的访客都愿意这样做,也许其中的1/4将位于“安全”的位置,并且不需要。
史蒂夫

1
推荐不需要知道用户是否正在实施该推荐。
Lee Louviere

-1 OP表示这不是解决方案,“我的10%的用户将通过非常不稳定的24k拨号线路登录,如果幸运的话,一天仅可使用几个小时”
Lee Louviere

7

我建立了一个小库,该库可以在我测试过的所有主要平台和浏览器上运行:https : //github.com/jLynx/PrivateWindowCheck

您可以简单地致电

isPrivateWindow(function(is_private) {
    if(is_private)
        alert('Private');
    else
        alert('Not Private');
});

我不知道为什么有人低估了你?这是另一个:.... gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1
user10216038

我猜这个脚本是在Chrome 76之前编写的,它不再适用于Chrome?
Lii

该方法的命名看起来是错误的。应该是alertIfPrivateWindow因为该函数是alert()ing。使用is前缀表示返回一个布尔值。这是错误的。
SandRock

在此示例中,@ SandRock会在不考虑天气的情况下发出警报,无论其是否私有。因此,此处建议的名称更改不太有意义
jLynx

4

localStorage诀窍是已经修正了一个错误,它不会在Safari 11.0工作了。

在Safari,Opera和Internet Explorer(不是Chrome)中,还有一种有趣的替代方法:这些浏览器发送DNT: 1标头(“不跟踪”)。

它不是100%可靠的,因为可以为常规浏览启用此标头(默认情况下处于禁用状态),但是它可以帮助识别注重隐私的用户。


DNT在最新的Safari 11 beta版中已损坏。它不再仅通过HTTP标头暴露给JavaScript。
艾蒂安·马丁

3

激活隐私模式后,Web浏览器的行为会有所不同

在许多浏览器上,资源的缓存是有限的。可以根据其CSS缓存检测浏览器的位置无需JavaScript即可进行此攻击

EFF正在研究指纹浏览器的项目。激活隐私模式后,浏览器的部分指纹会有所不同。继续 尝试


1
感谢您的有趣链接。我试了一下,但所做的只是更换指纹。如果我的工作做对了,我将无法判断访问者之前是否带有不同的指纹,因此能够检测到私人浏览?
史蒂夫

@Steve尽管我没有做太多挖掘工作,但我怀疑启用私有浏览后,指纹的一部分总是异常。但这是高度特定于浏览器的。
rook 2010年

1
有趣的阅​​读。目前,“尝试”链接已断开。:(
Mrchief '16

3

如果未启用私人浏览,则不会阻止它们。

为什么根本没有智能消息框?

尝试为所有浏览器和平台设置唯一的cookie是否可行?有人做过吗?

我认为最优雅的解决方案是:

  • 执行安全性泄漏测试
  • 如果安全性泄漏测试表明存在问题
    • 告诉用户检查设置
    • 建议隐私模式

因为正如您所说,并不是每个人都可以或需要启用隐私模式。


1
您将如何进行安全性泄漏测试?
史蒂夫

尝试做您要保护的事情。如果您不想要Cookie,请尝试制作一个。
Lee Louviere

3

我同意DigitalSeas的观点,即通常不应尝试检测用户是否处于“私人浏览”模式。但是,我最近发现FireFox现在订阅了一项名为“ disconnect.me”的服务,该服务提供了其在“跟踪保护”功能中使用的网址黑名单。由于disconnect.me将某些社交网络列入黑名单(例如Facebook的facebook.net),因此我们发现其SDK无法加载到FireFox中。因此,为了向用户提供更有用和更准确的错误消息,我们可以尝试检测私有浏览模式似乎是合理的。

考虑到这一点,该要旨声称可以使用特定于这些浏览器的技巧为主要浏览器中的私人浏览提供检测。在撰写本文时(在您阅读本文时,要点可能已经更新),检测逻辑如下:

function retry(isDone, next) {
    var current_trial = 0, max_retry = 50, interval = 10, is_timeout = false;
    var id = window.setInterval(
        function() {
            if (isDone()) {
                window.clearInterval(id);
                next(is_timeout);
            }
            if (current_trial++ > max_retry) {
                window.clearInterval(id);
                is_timeout = true;
                next(is_timeout);
            }
        },
        10
    );
}

function isIE10OrLater(user_agent) {
    var ua = user_agent.toLowerCase();
    if (ua.indexOf('msie') === 0 && ua.indexOf('trident') === 0) {
        return false;
    }
    var match = /(?:msie|rv:)\s?([\d\.]+)/.exec(ua);
    if (match && parseInt(match[1], 10) >= 10) {
        return true;
    }
    return false;
}

function detectPrivateMode(callback) {
    var is_private;

    if (window.webkitRequestFileSystem) {
        window.webkitRequestFileSystem(
            window.TEMPORARY, 1,
            function() {
                is_private = false;
            },
            function(e) {
                console.log(e);
                is_private = true;
            }
        );
    } else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
        var db;
        try {
            db = window.indexedDB.open('test');
        } catch(e) {
            is_private = true;
        }

        if (typeof is_private === 'undefined') {
            retry(
                function isDone() {
                    return db.readyState === 'done' ? true : false;
                },
                function next(is_timeout) {
                    if (!is_timeout) {
                        is_private = db.result ? false : true;
                    }
                }
            );
        }
    } else if (isIE10OrLater(window.navigator.userAgent)) {
        is_private = false;
        try {
            if (!window.indexedDB) {
                is_private = true;
            }                 
        } catch (e) {
            is_private = true;
        }
    } else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
        try {
            window.localStorage.setItem('test', 1);
        } catch(e) {
            is_private = true;
        }

        if (typeof is_private === 'undefined') {
            is_private = false;
            window.localStorage.removeItem('test');
        }
    }

    retry(
        function isDone() {
            return typeof is_private !== 'undefined' ? true : false;
        },
        function next(is_timeout) {
            callback(is_private);
        }
    );
}

1

嗯,您不会真正将私有模式与“阻止所有cookie”区分开来,但是除了这种罕见的情况之外,我认为它应该可以工作。


IMO的最大问题是,这是一个非常糟糕的网站设计,并不比90年代普遍使用的“您需要浏览器xxx才能看到此网站”更好。并非所有的浏览器都具有“私人浏览”模式(例如,我鄙视IE,例如,您淘汰了IE7用户),并且这些用户根本无法访问您的网站。

另外,当我上网时,我经常会打开多个带有多个网站的标签。对于我来说,不得不切换到私有模式只是为了查看该网站而不能同时访问其他网站,真的很烦。

您可以做的一件事是使用会话而不是Cookie来设计站点,这样就不会存储它们(因为您不使用它们...)。至于历史……真的,这是什么问题?


2
或者,将整个站点置于受密码保护的加密连接之后,并积极禁用缓存。
Marcel Korpel

@The Rook:不:它很有趣。存在一些奇异的技术挑战,例如要求所有用户都通过https进行操作,但知道某些国家/地区阻止了ssl连接,或者知道我的用户中有10%将通过非常不稳定的24k拨号线路登录,并且仅能为几个用户供电如果幸运的话,每天可以工作几个小时...
Steve 2010年

1

浏览器制造商正在积极修补浏览器错误,使站点可以识别私有模式。仍然存在一些错误,但是检测该错误的代码不太可能值得编写,因为该计划不能长期有效。

浏览器制造商修复这些错误的原因是,新闻发布商之类的网站正在使用这些错误来识别私人用户,并拒绝为其提供服务。想要做到这一点的新闻发布者倾向于使用“计量付费墙”,它使每个浏览器每天(或每周或每周)查看一定数量的免费文章,然后开始收费:因为私有模式有效地重置了计费器,发布者不希望您使用私有模式。但是,限制私有模式还会限制出于其他原因想要使用私有模式的人,例如,家庭受虐受害者不想与滥用者共享浏览器上的历史记录,或者不想让当前活动影响他们将来看到的广告的人或其他原因。

不保留历史记录的另一种方法是:使用浏览器,让您事后有选择地清除它。例如,Chrome可以清除与特定域相关联的Cookie,缓存和历史记录,或清除指定的时间段,例如“最后一个小时”。这样一来,您就不需要私有模式或隐身模式:通过在普通模式下浏览然后清除迹线,可以得到相同的效果。但是您必须知道如何执行此操作,另外还必须记住要执行此操作,因此与使用私有模式相比,这是一种更麻烦的方法。不过,我希望有些人将其用作解决方法,如果他们的浏览器仍然存在一个漏洞,该漏洞可使站点检测到它们何时处于私有模式并拒绝其服务。

如果您作为网站作者有理由不希望将您的网站存储在缓存或历史记录中,例如,如果该网站旨在帮助家庭虐待的受害者,那么“如何检测私人模式”可能是错误的问题,因为您真正想要的是“无论是否使用私有模式,都不要在历史记录中存储这些东西”。css-tricks.com上的Chris Coyier指出,window.location.replace()这不会创建历史记录项目以及类似的技术可用于构建一个站点,该站点至少不会在历史记录中保留其各个页面(至少在打开Javascript的情况下不会),但是引荐页面-可能具有危险的搜索结果页面-如果他们未正确“退出”该网站,那么它们仍将保留在历史记录中,就像它们位于的最后一页一样。(也可以通过缓存取证来识别中间页面,但是任何能够做到的人都可能会在发生流量时将其记录下来,因此我们只希望滥用者不是那么聪明。)另一种可能的方法可能是创建无辜者外观的Cookie,用于存储页面首次加载的时间戳,如果当前时间超过该时间戳的时间过长,则将其内容替换为其他内容,尽管它的URL仍然可以在另一台设备上加载或通过清除cookie加载(除非它也依赖于会话)。但是,摆脱引荐页仍然是一个问题,并且由于并非总是能够确认用户处于私有模式,因此最好的策略可能是采取措施对他们进行私有模式教育。

如果选中它们User-Agent,则可以在他们的浏览器和OS上向他们显示私有模式和非私有模式的外观,请他们确认这两者中的哪一个当前与其当前窗口匹配,并警告他们是否选择了非私有模式出现。这不适用于您未测试的浏览器和操作系统组合(但是基于错误的检测也不会),并且假定用户足够关心他们的安全性以至于认真考虑这个问题,但是如果他们不这样做,那么反正战斗可能已经失败了。


这是我在该线程中读过的最好的答案。
Gunnar Vestergaard

0

我已经通过使用两个HTML页面解决了这个问题。主页定义一个状态变量并设置一个cookie。第二页在新窗口(不是选项卡)中打开,读取cookie并将状态设置为cookie值。在MSIE下,当主页在普通模式下时,cookie值将传递到子页面。在“ InPrivate浏览”模式下,Cookie值不会传递到子页面(但是,如果您打开新的选项卡,则会传递)。

main.html页面:

<script>     
var myCookie="nocookie";
document.cookie="checkInPrivate=1";
var h=window.open("child.html", "_blank", "left=9999,height=200,width=200");
setTimeout(function() {
    var status=null;
    if (myCookie=="nocookie") {
        status="unable to determine if we are InPrivate Browsing mode (child page did not set the cookie)";
    } else if (myCookie.indexOf("checkInPrivate")>=0) {
        status="not in InPrivate Browsing mode (child page did set the cookie)";
    } else {
        status="in InPrivate Browsing mode (child page set the cookie value but it was not provided)";
    }
    alert(status);
}, 200);
</script>

child.html页面:

Detecting MSIE's InPrivate Browsing mode...
<script>
window.opener.myCookie=document.cookie;
window.close();
</script>

我使用InPrivate浏览模式是为了防止启用浏览器帮助对象(BHO)和浏览器扩展,因为BHO通常是恶意软件,即使使用HTTPS和强身份验证,它们也可以修改网页。Internet Explorer 9在其“隐私”设置中具有“禁用InPrivate浏览开始时的工具栏和扩展名”。

但是,这并不是防止恶意浏览器扩展的最终方法:恶意扩展可能会更改主页行为,以使其认为myCookie尚未设置该值。我们会错误地假设我们处于InPrivate浏览模式。

请注意,我需要为我的应用程序使用cookie,因此我不会为此目的使用InPrivate浏览。


0

编写代码以实现以下

1)在firefox测试浏览器版本中。此方法适用于版本> = 33.0(支持服务人员)。无法在旧版本(<33.0)版本中使用此方法。

2)尝试设置服务人员。3)如果您可以设置,使用或访问服务工作者,则您1000%不在私有浏览模式下,因为服务工作者无法在Firefox私有浏览模式下进行交互。我希望他们可以。

引用:

“在Firefox中,Service Worker API被隐藏,并且当用户处于私人浏览模式时不能使用”

https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API/Using_Service_Workers


0

不知道它是否是这个问题的根源,但是Firefox确实提供了有关如何检测私有浏览模式的文档。但是,它涉及使用其DXR PrivateBrowsingUtils的导入:

try {
      // Firefox 20+
      Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
      if (!PrivateBrowsingUtils.isWindowPrivate(window)) {
        ...
      }
    } catch(e) {
      // pre Firefox 20 (if you do not have access to a doc. 
      // might use doc.hasAttribute("privatebrowsingmode") then instead)
      try {
        var inPrivateBrowsing = Components.classes["@mozilla.org/privatebrowsing;1"].
                                getService(Components.interfaces.nsIPrivateBrowsingService).
                                privateBrowsingEnabled;
        if (!inPrivateBrowsing) {
          ...
        }
      } catch(e) {
        Components.utils.reportError(e);
        return;
      }
    }

2
这已弃用,在当前版本的firefox中不起作用@Endless Answer似乎在最新的Firefox和Chrome版本中适用于我
Mahmoud Mostafa

0

在创建Safari扩展时,我发现可以查询boolean safari.self.browserWindow.activeTab.private。下面为我​​工作,以检查浏览器是否在Private中打开,而仅从扩展名中打开。

isPrivate = false;
try {
isPrivate = safari.self.browserWindow.activeTab.private;
} catch (_) {
isPrivate = true;
}
if (isPrivate === true){
console.log("Private window.");}
else {
console.log("Not private window.");}

资料来源:developer.apple.com | 私有实例


0
function isPrivate(callback) {
  callback || (callback = function(){});
  var fs = window.RequestFileSystem || window.webkitRequestFileSystem;

  if(fs){
    return fs(window.TEMPORARY, 1, callback.bind(this, false), callback.bind(this, true));
  }

  if(window.indexedDB && /Firefox/.test(window.navigator.userAgent)){
    try {
      var db       = window.indexedDB.open('test');
      var tryes    = 0;
      var interval = limit = 10;

      var wait = function(check){
        if(tryes >= limit){ return callback(true); } // Give up
        return window.setTimeout(check, ++tryes * interval);
      }

      var evaluate = function(){
        return db.readyState === 'done' ? callback(!db.result) : wait(evaluate);
      }

      return wait(evaluate);
    } catch (e) {
      return callback(true);
    }
  }

  if (!!window.navigator.userAgent.match(/(MSIE|Trident|Edge)/)){
    try {
      return callback(!window.indexedDB);
    } catch (e) {
      return callback(true);
    }
  }

  try {
    window.openDatabase(null, null, null, null);
    return callback(false);
  } catch (e) {
    return callback(true);
  }
}

isPrivate( function(isPrivate) {
  console.log('Private mode ===>', isPrivate);
});

0

您可以找到此要点来检测私人浏览

var hasStorage = function() {
      var mod,
        result;
      try {
        mod = new Date;
        localStorage.setItem(mod, mod.toString());
        result = localStorage.getItem(mod) === mod.toString();
        localStorage.removeItem(mod);
        return result;
      } catch (_error) {
        return false;
      }
    },
    hasCookies = function() {
      var cookieEnabled = navigator.cookieEnabled ? true : false;

      if (typeof navigator.cookieEnabled == 'undefined' && !cookieEnabled) {
        document.cookie = 'testcookie';
        cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
      }
      return cookieEnabled;
    };

  if (!hasStorage()) {
    document.getElementById('apple_storage').style.display = 'block';
  } else if (!hasCookies()) {
    document.getElementById('no_cookie').style.display = 'block';
  }
<!-- ERROR FOR BLOCKED LOCAL STORAGE -->
<div id="apple_storage" style="display:none;">
    <div class="modal-new alerts">
        <h2>Attenion</h2>
        <a href="" class="close" onclick="document.getElementById('apple_storage').style.display = 'none';">Close</a>
        <div class="body">
            <p>
                Dear customer, to ensure proper use of the site it is necessary to abandon the
                private browsing.
            </p>
        </div><!-- /.body -->
    </div>
</div>

<!-- ERROR FOR BLOCKED COOKIES -->
<div id="no_cookie" style="display:none;">
    <div class="modal-new alerts">
        <h2>Attenion</h2>
        <a href="" class="close" onclick="document.getElementById('no_cookie').style.display = 'none';">Close</a>
        <div class="body">
            <p>
                Dear customer, to ensure proper use of the site it is necessary to enable cookies.
            </p>
        </div><!-- /.body -->
    </div>
</div>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.