Определение, использует ли браузер режим приватного просмотра - PullRequest
57 голосов
/ 19 мая 2010

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

Я нашел только это http://jeremiahgrossman.blogspot.com/2009/03/detecting-private-browsing-mode.html а также https://serverfault.com/questions/18966/force-safari-to-operate-in-private-mode-and-detect-that-state-from-a-webserver

Идеальное решение - использовать javascript без кода или с минимальным. Будет ли попытка установить уникальный файл cookie для всех браузеров и платформ? Кто-нибудь делал это раньше?

спасибо!


обновление

http://crypto.stanford.edu/~collinj/research/incognito/ использует технику посещения CSS отпечатков пальцев браузера, упомянутых в других постерах - спасибо за подсказки.

Мне это нравится, потому что оно маленькое и элегантное, но, тем не менее, я хочу иметь возможность делать это без JavaScript, если это возможно.

Ответы [ 16 ]

1 голос
/ 02 апреля 2019
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);
});
1 голос
/ 19 мая 2010

Ну, вы бы не стали так отличать приватный режим от "блокировать все куки", но кроме этой редкой ситуации, я думаю, это должно сработать.


Большая проблема IMO, это то, что это очень и очень плохой дизайн сайта, не лучше, чем старый добрый «вам нужен браузер xxx, чтобы увидеть этот сайт», что было распространено в 90-х. Не во всех браузерах есть режим приватного просмотра (насколько я презираю IE, например, то, что вы исключаете пользователей IE7), и эти пользователи вообще не смогут получить доступ к вашему сайту.

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

Одна вещь, которую вы могли бы сделать, - это создать сайт с использованием сеансов вместо файлов cookie, чтобы они не сохранялись (так как вы их не используете ...). А что касается истории ... действительно, в чем проблема?

0 голосов
/ 24 марта 2019

При создании расширения Safari я обнаружил, что можно запросить логическое значение safari.self.browserWindow.activeTab.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 голосов
/ 08 марта 2017

Не уверен, что причина этого вопроса старая, но 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;
      }
    }
0 голосов
/ 05 октября 2016

Введите код для достижения следующего

1) В тестовой версии браузера Firefox. Этот метод работает с версией> = 33.0 (поддерживает сервисных работников). Невозможно использовать этот метод со старыми (<33.0) версиями. </p>

2) Попробуйте установить сервисный работник. 3) Если вы можете установить, использовать или получить доступ к сервисному работнику, вы на 1000% не находитесь в режиме частного просмотра, поскольку с сервисными работниками нельзя взаимодействовать в режиме частного просмотра Firefox. Я хотел бы, чтобы они могли быть.

Цитата:

«В Firefox API Service Worker скрыты и не могут использоваться, когда пользователь находится в режиме частного просмотра»

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers

0 голосов
/ 18 июля 2013

Я решил эту проблему, используя две HTML-страницы. На главной странице определяют переменную состояния и устанавливают 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 Browsing для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...