Чи можете ви визначити, чи Chrome перебуває в режимі анонімного перегляду через сценарій?


114

Чи можна встановити, чи Google Chrome перебуває в режимі анонімного перегляду через сценарій?

Редагувати: я фактично мав на увазі, чи це можливо за допомогою сценарію користувача, але відповіді передбачають, що JavaScript працює на веб-сторінці. Я знову задав тут питання щодо сценаріїв користувачів.


28
Це було б не дуже, incognitoякби ви могли це легко визначити :)
Арен,

І ви повинні пам’ятати, що користувач повинен дозволити режим інкогніто для посібника з розширенням. За замовчуванням все вірно.
Мохамед Мансур

@Mohamed: Користувач повинен дозволити це було б я, так що це не буде проблемою :)
RodeoClown


1
@PeteAlvin Або сайт може погіршити значення, виявивши інкогніто. Сайт Бостонського глобуса не відображатиме статті в режимі інкогніто, не даючи користувачеві обійти квоти на безкоштовні статті. Взагалі, я вважаю за краще, щоб сайт знав про мене менше.
JohnC

Відповіді:


232

Так. API FileSystem вимкнено в режимі анонімного перегляду. Перевірте 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. дивно ...
Алок

1
Я спробував у Chrome. Це працює, але логіка зворотна.
Лукас Массу

9
Це скоро піде через ці зобов'язання
blueren

8
провал в хромі v 77.0.3865.90
Gitesh Purbia

18

Один із способів - відвідати унікальну URL-адресу, а потім перевірити, чи посилання на цю URL-адресу трактується як відвідуваний CSS.

Ви можете побачити приклад цього в "Виявлення анонімного посилання " (мертве посилання) .

Дослідницький документ того ж автора замінить Виявлення посилання 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 кричати про "Небезпечний Javascript". Однак це буде працювати з веб-сервера.


Це досить круто, я не розумів, що режим анонімного перегляду не виділяє відвідувані посилання. Це вимагає від користувача натиснути посилання.
Ігор Зевака

1
Ні, ні, iframe "клацає" посиланням.
кібібу

40
Це насправді не працює, оскільки більшість браузерів не виставляє: інформацію про відвідуваний стиль через JavaScript. Інтерфейс CSS буде говорити так, ніби посилання має не відвідуваний колір. Це захід безпеки, який існує у веб-переглядачах WebKit та Gecko як мінімум з 2010 року. Це було для захисту історії користувача (наприклад, можна спробувати всі можливі URL-адреси та відправити відвідуваних сторонній стороні. Таким чином можна отримати доступ до маркерів в URL-адресах і що ні).
Тімо Тіхоф

2
Офіційна стаття Mozilla, що пояснює зміни конфіденційності щодо :visited: hacks.mozilla.org/2010/03/…
Denilson Sá Maia

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 . За винятком того, що не висвітлюються посилання, усі режими анонімного перегляду не зберігають історію перегляду та кукі. На сторінці довідки google :

  • Веб-сторінки, які ви відкриваєте, та файли, завантажені під час анонімного перегляду, не реєструються в історії перегляду та завантаження.
  • Усі нові файли cookie видаляються після закриття всіх відкритих вікон анонімного перегляду.

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

Тут ви можете побачити, що саме ваш браузер надсилає на сервер, використовуючи один з багатьох аналізаторів запитів HTTP, як цей, тут . Порівняйте заголовки між звичайним сеансом та інкогніто, і ви не побачите різниці.


Останнім часом він вимикає всі розширення, крім тих розширень, які користувач спеціально позначив як безпечний режим.
Tiberiu-Ionuț Stan

4

Якщо ви розробляєте розширення, тоді ви можете скористатися API вкладок, щоб визначити, чи вікно / вкладка анонімне.

Більше інформації можна знайти тут .

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

Я цього не перевіряв, але підозрюю, що всі дзвінки до localStorage теж не вдається.


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');

Це виглядає дуже цікаво і є формою 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

Функція швидкої копіювання та вставки на основі відповіді Alok (зверніть увагу: це асинхронно)

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') });

це вже не працює (можливо, це працювало і раніше)
Олександру 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

Підтверджено <Chrome>: "Помилка режиму анонімного режиму. Ваш браузер, здається, знаходиться в режимі анонімного режиму."
Піт Елвін

Я думаю, цю посаду можна вдосконалити, оскільки вона, безумовно, не говорить про факти. Як це доведено вже і вгору, і вниз від цієї відповіді, можна побачити, чи хтось хотів би побачити, чи відвідують їх у режимі анонімного перегляду або зі звичайного хромового браузера.
FortuneSoldier

@ILikeTacos Я знаю, що твоєму коментарю (більше ніж) чотири роки, але Chrome навмисно порушив їхнє виявлення анонімного перегляду, тож я все ще відчуваю, що перемогла на цьому ...
Щеня

@Puppy Ну так. Але не на самому ділі немає mishravikas.com/articles/2019-07 / ...
Cruncher
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.