Можете ли вы определить, находится ли Chrome в режиме инкогнито, с помощью скрипта?

114

Можно ли с помощью скрипта определить, находится ли Google Chrome в режиме инкогнито?

Изменить: я действительно имел в виду, возможно ли это через пользовательский скрипт, но ответы предполагают, что JavaScript работает на веб-странице. Я вновь задал вопрос здесь в отношении пользовательских скриптов.

РодеоКлоун
источник
28
Было бы не очень, incognitoесли бы это можно было легко определить :)
Арен
И вы должны помнить, что пользователь должен разрешить режим инкогнито для руководства по расширению. По умолчанию все верно.
Мохамед Мансур
@Mohamed: Пользователь должен разрешить это мне, так что это не будет проблемой :)
RodeoClown
1
@PeteAlvin Или сайт может снизить ценность, обнаружив инкогнито. Сайт Boston Globe не будет отображать свои статьи в режиме инкогнито, что не позволит пользователю обойти свою квоту на бесплатные статьи. В общем, я предпочитаю, чтобы сайт знал обо мне меньше.
JohnC

Ответы:

232

Да. 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"));
    }

Алок
источник
19
Это наименее хакерский способ, и он должен быть наверху. Чисто и элегантно.
Том Теман
1
@ user2718671 jsfiddle.net/w49x9f1a по- прежнему отлично работает для меня в последней версии Chrome на Mac OSX. странно ...
Alok
1
Я пробовал в Chrome. Это работает, но логика обратная.
Лукас
9
Это собирается уходить скоро благодаря этим фиксаций
blueren
8
сбой в Chrome v 77.0.3865.90
Gitesh Purbia
18

Один из способов - посетить уникальный URL-адрес, а затем проверить, считается ли ссылка на этот URL-адрес посещенной CSS.

Вы можете увидеть пример этого в «Обнаружении инкогнито» (мертвая ссылка) .

Исследовательская статья того же автора для замены ссылки "Обнаружение инкогнито" выше

В 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.htmliFrame загружаются:

<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 плакать о «небезопасном Javascript». Однако он будет работать с веб-сервером.

JHurrah
источник
Это довольно круто, я не знал, что в режиме инкогнито не отображаются посещенные ссылки. Однако для этого требуется, чтобы пользователь щелкнул ссылку.
Игорь Зевака
1
Нет, iframe «нажимает» на ссылку.
kibibu
40
На самом деле это не работает, поскольку большинство браузеров не предоставляют информацию о посещенных стилях через javascript. Интерфейс CSS сообщит, что ссылка имеет непосещенный цвет. Это мера безопасности, которая присутствует в браузерах WebKit и Gecko по крайней мере с 2010 года. Это было сделано для защиты истории пользователя (например, можно было перепробовать все возможные URL-адреса и отправить посещенные третьим лицам. Таким образом можно было получить доступ к токенам в URL-адресах, а что нет).
Timo Tijhof
2
Официальная статья Mozilla, объясняющая изменения конфиденциальности относительно :visited: hacks.mozilla.org/2010/03/…
Денилсон Са Майя
18

В Chrome 74+ это можно определить, оценив доступное пространство для хранения файловой системы.

См. Jsfiddle

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')
}
Винни Джеймс
источник
4
Теперь это правильный ответ. Либо принятый ответ должен быть обновлен этим, либо принятый ответ должен измениться. Не отрывать от первоначально принятого ответа, так как это было правильное решение в то время.
Cruncher
8

Вы можете в JavaScript увидеть ответ JHurrah . За исключением того, что ссылки не выделяются, в любом режиме инкогнито не сохраняется история просмотров и файлы cookie. Со страницы справки Google :

  • Веб-страницы, которые вы открываете, и файлы, загружаемые в режиме инкогнито, не записываются в истории ваших просмотров и загрузок.
  • Все новые файлы cookie удаляются после закрытия всех открытых вами окон в режиме инкогнито.

Как вы можете видеть, разница между обычным просмотром и инкогнито возникает после посещения веб-страницы, поэтому браузер ничего не передает серверу, когда он находится в этом режиме.

Вы можете увидеть, что именно ваш браузер отправляет на сервер, используя один из многих анализаторов HTTP-запросов, например этот . Сравните заголовки между обычным сеансом и инкогнито, и вы не увидите разницы.

Игорь Зевака
источник
В последнее время он отключает все расширения, кроме тех, которые были специально помечены пользователем как безопасные для инкогнито.
Tiberiu-Ionu Stan
4

Если вы разрабатываете расширение, вы можете использовать API вкладок, чтобы определить, является ли окно / вкладка инкогнито.

Более подробную информацию можно найти здесь .

Если вы просто работаете с веб-страницей, это непросто, и так оно и было задумано. Однако я заметил, что все попытки открыть базу данных (window.database) терпят неудачу в режиме инкогнито, потому что в режиме инкогнито не разрешается оставлять следы данных на компьютере пользователя.

Я не тестировал его, но подозреваю, что все вызовы localStorage тоже терпят неудачу.

Kinlan
источник
3

При этом используется обещание дождаться, пока асинхронный код установит флаг, чтобы впоследствии мы могли использовать его синхронно.

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');
Aljgom
источник
Это выглядит очень интересно и является формой Javascript , что я не знаком с и , кажется , не поддерживается моим Netbeans 8.2 IDE в ОС Windows 10. Но если я могу получить его на работу, я тоже любопытно: могу ли я заменить reject('Check incognito failed')с , resolve(false)если я хочу isIncognitoбыть логическим, которое всегда истинно или ложно? Спасибо.
Райан
2
Я понимаю Syntax Error: await is a reserved wordи думаю, что awaitвсегда нужно быть в рамках asyncфункции. Поэтому я думаю, что этот код не работает.
Райан
1
rejectвызовет исключение, если оно будет вызвано, и значение не будет возвращено, так isIncognitoбудет всегда trueили falseтак, как написан код. Однако вы также можете использовать здесь «разрешение», если хотите, чтобы возвращалось значение. И это может зависеть от того, как среда обрабатывает ожидание в глобальной области видимости? Он работает на хромированной консоли в глобальной области видимости, но вы можете попробовать обернуть все (async function() { 'everything here' })();так, чтобы оно запускалось внутри асинхронной функции
aljgom
2
В качестве альтернативы вы можете просто сохранить обещание isIncognitoвместо результата и затем запустить его в асинхронной функции: let isIncognito = new Promise( ...etcтогда в другом месте у вас будет такая функция, как(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
aljgom
1
Этот ответ является недействительным в хроме 76+
Cruncher
0

Функция быстрого копирования и вставки на основе ответа Алока (примечание: это асинхронно)

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') });
Aljgom
источник
это больше не работает (возможно, это работало в прошлом)
Alexandru R
2
Только что обновил свой хром, и он все еще работает. Я вижу, что вы разместили то же самое выше, а затем сказали, что ошиблись, просто указав на это для будущих зрителей (не стесняйтесь удалять свой комментарий, я удалю этот, если вы это сделаете).
aljgom
0

Вот предлагаемый ответ, написанный на синтаксисе 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)
Никксан
источник
0

Здесь решение с использованием обещаний

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))
Хуан Рикардо
источник
-10

В документации по режиму инкогнито специально сказано, что веб-сайты не будут вести себя иначе. Я считаю, что это означает, что ответ отрицательный.

Щенок
источник
9
Я знаю, что этому ответу 4 года, но недавно Netflix внедрил функцию обнаружения инкогнито, и это вызвало у меня интерес к исследованию того, как они это делают. Если вы посещаете Netflix в режиме инкогнито, netflix не позволяет вам воспроизводить видео.
ILikeTacos 03
Проверено <Chrome>: «Ошибка режима инкогнито. Похоже, ваш браузер находится в режиме инкогнито».
Пит Элвин
Я думаю, что этот пост можно улучшить, потому что он определенно не содержит фактов. Как уже доказано как вверх, так и вниз из этого ответа, можно увидеть, хочет ли кто-то увидеть, посещают ли они его из режима инкогнито или из обычного браузера Chrome.
FortuneSoldier
@ILikeTacos Я знаю, что вашему комментарию (больше) четырех лет, но Chrome намеренно нарушил функцию распознавания инкогнито, так что я все еще чувствую, что выиграл в этом ...
Puppy
@Puppy Ну да. Но не на самом деле нет mishravikas.com/articles/2019-07/...
Cruncher