Javascript 你能通过脚本确定Chrome是否处于匿名模式吗?
是否有可能通过脚本确定谷歌浏览器是否处于匿名模式Javascript 你能通过脚本确定Chrome是否处于匿名模式吗?,javascript,google-chrome,incognito-mode,Javascript,Google Chrome,Incognito Mode,是否有可能通过脚本确定谷歌浏览器是否处于匿名模式 编辑:我的意思是,通过用户脚本是否可以,但答案是假设JavaScript正在网页上运行。我已经问了关于用户脚本的问题 一种方法是访问唯一的URL,然后检查指向该URL的链接是否被CSS视为已访问 你可以在“侦测隐姓埋名”(死链接)中看到一个例子 在main.html中添加一个iframe <iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src=
编辑:我的意思是,通过用户脚本是否可以,但答案是假设JavaScript正在网页上运行。我已经问了关于用户脚本的问题 一种方法是访问唯一的URL,然后检查指向该URL的链接是否被CSS视为已访问 你可以在“侦测隐姓埋名”(死链接)中看到一个例子 在
main.html
中添加一个iframe
<iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
然后在加载到iFrame的test.html
中:
<style>
a:link { color: #336699; }
a:visited { color: #3366A0; }
</style>
<script>
setTimeout(function() {
var a = document.createElement('a');
a.href = location;
a.id = 'test';
document.body.appendChild(a);
parent.checkResult();
}, 100);
</script>
a:链接{color:#336699;}
a:访问{color:#3366A0;}
setTimeout(函数(){
var a=document.createElement('a');
a、 href=位置;
a、 id=‘测试’;
文件.正文.附件(a);
parent.checkResult();
}, 100);
注意:从文件系统尝试这一点会让Chrome哭喊“不安全的Javascript”。信息技术
但是,将在Web服务器上工作。您可以在JavaScript中查看JHurrah的。除了不突出显示链接外,所有匿名模式都不保存浏览历史记录和cookie。来自谷歌:
- 您在匿名时打开的网页和下载的文件 没有记录在您的浏览和 下载历史记录
- 关闭所有匿名窗口后,将删除所有新cookie 你已经打开了
您可以使用许多HTTP请求分析器中的一个来查看浏览器到底向服务器发送了什么,如。比较正常会话和incognito之间的标题,您将看不到任何差异。如果您正在开发扩展,则可以使用tabs API确定窗口/选项卡是否为incognito 可以找到更多信息 如果你只是在处理一个网页,这并不容易,而且它就是这样设计的。但是,我注意到,在incognito中打开数据库(window.database)的所有尝试都会失败,这是因为在incognito中,不允许在用户计算机上留下任何数据痕迹
我还没有测试它,但我怀疑对localStorage的所有调用也会失败。*Edit;以下内容不再适用于Chrome:* 对。文件系统API在匿名模式下被禁用。当您处于或不处于匿名模式时,请检查 示例代码:
var fs=window.RequestFileSystem | | window.webkitRequestFileSystem;
如果(!fs){
日志(“检查失败?”);
}否则{
财政司司长(临时窗口),
100,
console.log.bind(控制台,“不处于匿名模式”),
console.log.bind(控制台,“匿名模式”);
}
基于的快速函数(注意:这是异步的)
更新-不再工作
function ifIncognito(incog,func){
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) console.log("checking incognito failed");
else {
if(incog) fs(window.TEMPORARY, 100, ()=>{}, func);
else fs(window.TEMPORARY, 100, func, ()=>{});
}
}
用法:
ifIncognito(true, ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
更新此功能似乎不再有效
function ifIncognito(incog,func){
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) console.log("checking incognito failed");
else {
if(incog) fs(window.TEMPORARY, 100, ()=>{}, func);
else fs(window.TEMPORARY, 100, func, ()=>{});
}
}
这使用了一个承诺来等待异步代码设置标志,因此我们可以在之后同步使用它
let isIncognito = await new Promise((resolve, reject)=>{
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) reject('Check incognito failed');
else fs(window.TEMPORARY, 100, ()=>resolve(false), ()=>resolve(true));
});
那我们就可以做了
if(isIncognito) alert('in incognito');
else alert('not in incognito');
以下是用ES6 syntaxt编写的建议答案,稍微整理一下
const isIncognito = () => new Promise((resolve, reject) => {
const fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
reject('Cant determine whether browser is running in incognito mode!');
}
fs(window.TEMPORARY, 100, resolve.bind(null, false), resolve.bind(null, true));
});
// Usage
isIncognito()
.then(console.log)
.catch(console.error)
在Chrome 74至84.0.4147.135中,您可以通过 见
if(导航器中的“存储”和navigator.storage中的“估计”){
const{usage,quota}=wait navigator.storage.estimate();
log(`Using${usage}超出${quota}字节。`);
如果(配额<120000000){
console.log('Incognito')
}否则{
console.log('notincognito')
}
}否则{
console.log('无法检测')
}
这里是使用承诺的解决方案
const isIncognito = () => {
return new Promise((resolve, reject) => {
if ("storage" in navigator && "estimate" in navigator.storage) {
navigator.storage.estimate().then((res) => {
console.log(`Using ${res.usage} out of ${res.quota} bytes.`);
if (res.quota < 120000000) {
resolve(true);
} else {
reject(false);
}
});
} else {
reject(false);
}
});
};
这项工作将于2021年5月开始:
如果您可以很容易地确定它:),那么它就不会是非常隐姓埋名的(
incognito
),并且您必须记住,用户必须允许扩展手册使用隐姓埋名模式。默认情况下,一切都是真的。@Mohamed:必须允许的用户应该是我,所以这不会是问题:)@Petalvin或者该网站可以通过检测隐姓埋名来降低价值。《波士顿环球报》的网站不会以匿名方式展示其文章,从而防止用户规避免费文章配额。总的来说,我更喜欢一个对我了解较少的网站。这很酷,我没有意识到匿名模式不会突出显示访问过的链接。但这需要用户单击链接。不需要,iframe会“单击”链接。这实际上不起作用,因为大多数浏览器不会通过javascript公开:已访问的样式信息。CSS界面将显示链接是否具有未访问的颜色。这是WebKit和Gecko浏览器中的一项安全措施,至少从2010年开始。这是为了保护用户的历史记录(例如,用户可以尝试所有可能的URL,并将访问过的URL发送给第三方。通过这种方式,用户可以访问URL中的令牌,等等)。Mozilla官方文章解释了有关:visted
:最近,它禁用除用户特别标记为匿名安全的扩展之外的所有扩展。这是最不黑客的方式,应该在顶部。干净而优雅。@user2718671在mac osx上的最新Chrome中仍然适用于我。奇怪…我试过Chrome。它可以工作,但逻辑是相反的。这很快就会消失,多亏chrome v 77.0.3865.90中的commitsfail。它不再工作了(可能在过去工作过)刚刚更新了我的chrome,现在仍然可以工作。我看到你在上面发表了同样的评论,然后说你错了,只是向未来的观众指出了这一点(请随意删除你的评论,如果你这样做的话,我会删除这一条)。这看起来非常有趣,是一种Javascript形式,我不熟悉,而且在Windows 10中我的Netbeans 8.2 IDE似乎不支持这种形式。但如果我能让它工作,我也很好奇:我能替换reject('Check inc.)吗
const isIncognito = () => {
return new Promise((resolve, reject) => {
if ("storage" in navigator && "estimate" in navigator.storage) {
navigator.storage.estimate().then((res) => {
console.log(`Using ${res.usage} out of ${res.quota} bytes.`);
if (res.quota < 120000000) {
resolve(true);
} else {
reject(false);
}
});
} else {
reject(false);
}
});
};
isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
try{
var ls = localStorage;
alert("You are not in Incognito Mode.");
}
catch(e) { alert("You are in Incognito Mode."); }