Можете ли вы определить, включен ли Chrome в режиме инкогнито с помощью script?
Можно ли определить, находится ли Google Chrome в режиме инкогнито с помощью script?
Изменить: Я действительно имел в виду, что это возможно с помощью user- script, но ответы предполагают, что JavaScript работает на веб-странице. Я перепросил вопрос здесь в отношении пользовательских скриптов.
Ответы
Ответ 1
Да. FileSystem API отключен в режиме инкогнито. Проверьте https://jsfiddle.net/w49x9f1a/, когда вы находитесь и не находитесь в режиме инкогнито.
Пример кода:
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
console.log("check failed?");
} else {
fs(window.TEMPORARY,
100,
console.log.bind(console, "not in incognito mode"),
console.log.bind(console, "incognito mode"));
}
Ответ 2
Один из способов - посетить уникальный URL-адрес, а затем проверить, рассматривается ли ссылка на этот URL как посещаемый CSS.
Вы можете увидеть пример этого в "Обнаружении инкогнито" (Dead link).
Исследовательская работа того же автора, чтобы заменить ссылку Обнаружение Incognito выше
В main.html
добавить iframe,
<iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
и некоторый код JavaScript:
function checkResult() {
var a = frames[0].document.getElementById('test');
if (!a) return;
var color;
if (a.currentStyle) {
color = a.currentStyle.color;
} else {
color = frames[0].getComputedStyle(a, '').color;
}
var visited = (color == 'rgb(51, 102, 160)' || color == '#3366a0');
alert('mode is ' + (visited ? 'NOT Private' : 'Private'));
}
function setUniqueSource(frame) {
frame.src = "test.html?" + Math.random();
frame.onload = '';
}
Затем в test.html
, которые загружаются в iFrame:
<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>
ПРИМЕЧАНИЕ. Попробуйте это из файловой системы, чтобы крик Chrome о "Unsafe Javascript". Это
будет работать, однако, с веб-сервера.
Ответ 3
Вы можете в JavaScript видеть JHurrah ответ. За исключением того, что не выделяются ссылки, весь режим инкогнито не сохраняет историю просмотров и файлы cookie. Из google справочная страница:
- Веб-страницы, которые вы открываете, и файлы, загруженные во время инкогнито не отображаются в вашем браузере и истории загрузки.
- Все новые файлы cookie удаляются после закрытия всех окон инкогнито что вы открыли.
Как вы видите, различия между обычным просмотром и инкогнито случаются после, вы посещаете веб-страницу, поэтому нет ничего, что браузер связывает с сервером, когда он находится в этом режиме.
Вы можете видеть, что именно ваш браузер отправляет на сервер, используя один из многих анализаторов HTTP-запросов, например этот здесь. Сравните заголовки между обычным сеансом и инкогнито, и вы не увидите никакой разницы.
Ответ 4
Если вы разрабатываете расширение, вы можете использовать API вкладок, чтобы определить, является ли окно/вкладка инкогнито.
Более подробную информацию можно найти здесь.
Если вы просто работаете с веб-страницей, это не легко, и она разработана таким образом. Тем не менее, я заметил, что все попытки открыть базу данных (window.database) терпят неудачу, когда в режиме incongnito, это потому, что в режиме инкогнито не разрешается оставлять никаких следов данных на компьютере пользователя.
Я не проверял это, но я подозреваю, что все вызовы localStorage также терпят неудачу.
Ответ 5
При этом используется обещание дождаться, пока асинхронный код установит флаг, поэтому мы можем использовать его синхронно позже.
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');
Ответ 6
В Chrome 74+ вы можете определить это, оценивая доступное пространство для хранения файловой системы
if ('storage' in navigator && 'estimate' in navigator.storage) {
const {usage, quota} = await navigator.storage.estimate();
console.log('Using ${usage} out of ${quota} bytes.');
if(quota < 120000000){
console.log('Incognito')
} else {
console.log('Not Incognito')
}
} else {
console.log('Can not detect')
}
Ответ 7
Быстрая копировальная вставка на основе Alok Answer (обратите внимание: это асинхронно)
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') });
Ответ 8
Вот предложенный ответ, написанный в синтаксисе ES6 и немного проясненный.
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)
Ответ 9
Да, но должен ли ты? (Подсказка: нет, вы не должны)
Ответ 10
Документация для режима инкогнито специально говорит о том, что веб-сайты не будут вести себя по-другому. Я считаю, что это означает, что ответа нет.