javascript элемента Обнаружение, если браузер использует режим Private Browsing




кто может модерировать сервис есть идея при наличии соответствующих прав к блогу идей)? (11)

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

Я нашел только этот 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 - 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, если это возможно.


Напишите код для достижения следующего

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

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

Цитата:

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

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


Для большинства используемых браузеров можно обнаружить разрешенные частные режимы просмотра. Сюда входят Safari, Firefox, IE10, Edge и Google Chrome.

Fire Fox

Когда включен режим частного браузера Firefox, IndexedDB выдает InvalidStateError, потому что он недоступен в режиме частного просмотра.

К тому же, если это:

var db = indexedDB.open("test");
db.onerror = function(){/*Firefox PB enabled*/};
db.onsuccess =function(){/*Not enabled*/};

Сафари

Для Safari ключ - это локальная служба хранения. Он отключен в режиме конфиденциальности. Поэтому попробуйте обратиться к нему и использовать предложение try-catch. Следующий метод работает как на устройствах OSX, так и на iOS. Кредиты для этого метода идут на этот вопрос и ответ

var storage = window.sessionStorage;
try {
    storage.setItem("someKeyHere", "test");
    storage.removeItem("someKeyHere");
} catch (e) {
    if (e.code === DOMException.QUOTA_EXCEEDED_ERR && storage.length === 0) {
        //Private here
    }
}

IE10 / Край

Internet Explore даже отключает IndexedDB в режиме конфиденциальности. Поэтому проверьте наличие. Но этого недостаточно, потому что у старых браузеров, возможно, даже нет IDB. Так что сделайте еще одну проверку, например, для событий, которые имеют только IE10 и последующий браузер / trigger. Связанный с нами вопрос о CodeReview можно найти here

if(!window.indexedDB && (window.PointerEvent || window.MSPointerEvent)){
 //Privacy Mode
}

Хром

Режим Chomes Incognito может быть проверен файловой системой. Большое объяснение можно найти здесь на SO

var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
    console.log("FS check failed..");
    return;
}

fs(window.TEMPORARY, 100, function (fs) {}, function (err) {
//Incognito mode
});

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

Если компания обеспокоена безопасностью, я предлагаю перевести свой собственный Firefox или Chromium-дистрибутив с заблокированными настройками конфиденциальности и разрешить только настраиваемому клиенту подключаться к экстрасети.


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

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

EFF работает над проектом для отпечатков пальцев . Части отпечатков пальцев браузера будут отличаться при активации режима конфиденциальности. Давай, попробуй .


Я согласен с тем, что DigitalSeas считает, что мы вообще не пытаемся определить, находится ли пользователь в режиме «частного просмотра». Однако недавно я обнаружил, что FireFox теперь подписывается на услугу «disconnect.me», которая предоставляет черный список URL, который они используют в своей функции «отслеживания» . Так как disconnect.me черным списком определенных социальных сетей (например, facebook.net ), мы обнаружили, что их SDK не будут загружаться в FireFox. Поэтому представляется разумным, что мы могли бы попытаться обнаружить частный режим просмотра, чтобы предоставить пользователям более полезное и точное сообщение об ошибке.

С учетом этого оправдания этот принцип утверждает, что обеспечивает обнаружение для частного просмотра в основных браузерах с использованием трюков, специфичных для этих браузеров. На момент написания этой статьи (сущность может быть обновлена ​​к моменту, когда вы ее прочитали) логика обнаружения выглядит следующим образом:

function retry(isDone, next) {
    var current_trial = 0, max_retry = 50, interval = 10, is_timeout = false;
    var id = window.setInterval(
        function() {
            if (isDone()) {
                window.clearInterval(id);
                next(is_timeout);
            }
            if (current_trial++ > max_retry) {
                window.clearInterval(id);
                is_timeout = true;
                next(is_timeout);
            }
        },
        10
    );
}

function isIE10OrLater(user_agent) {
    var ua = user_agent.toLowerCase();
    if (ua.indexOf('msie') === 0 && ua.indexOf('trident') === 0) {
        return false;
    }
    var match = /(?:msie|rv:)\s?([\d\.]+)/.exec(ua);
    if (match && parseInt(match[1], 10) >= 10) {
        return true;
    }
    return false;
}

function detectPrivateMode(callback) {
    var is_private;

    if (window.webkitRequestFileSystem) {
        window.webkitRequestFileSystem(
            window.TEMPORARY, 1,
            function() {
                is_private = false;
            },
            function(e) {
                console.log(e);
                is_private = true;
            }
        );
    } else if (window.indexedDB && /Firefox/.test(window.navigator.userAgent)) {
        var db;
        try {
            db = window.indexedDB.open('test');
        } catch(e) {
            is_private = true;
        }

        if (typeof is_private === 'undefined') {
            retry(
                function isDone() {
                    return db.readyState === 'done' ? true : false;
                },
                function next(is_timeout) {
                    if (!is_timeout) {
                        is_private = db.result ? false : true;
                    }
                }
            );
        }
    } else if (isIE10OrLater(window.navigator.userAgent)) {
        is_private = false;
        try {
            if (!window.indexedDB) {
                is_private = true;
            }                 
        } catch (e) {
            is_private = true;
        }
    } else if (window.localStorage && /Safari/.test(window.navigator.userAgent)) {
        try {
            window.localStorage.setItem('test', 1);
        } catch(e) {
            is_private = true;
        }

        if (typeof is_private === 'undefined') {
            is_private = false;
            window.localStorage.removeItem('test');
        }
    }

    retry(
        function isDone() {
            return typeof is_private !== 'undefined' ? true : false;
        },
        function next(is_timeout) {
            callback(is_private);
        }
    );
}

Вот мой взгляд на обнаружение частного режима

function detectPrivateMode(cb) {
    var db,
    on = cb.bind(null, true),
    off = cb.bind(null, false)

    function tryls() {
        try {
            localStorage.length ? off() : (localStorage.x = 1, localStorage.removeItem("x"), off());
        } catch (e) {
            // Safari only enables cookie in private mode
            // if cookie is disabled then all client side storage is disabled
            // if all client side storage is disabled, then there is no point
            // in using private mode
            navigator.cookieEnabled ? on() : off();
        }
    }

    // Blink (chrome & opera)
    window.webkitRequestFileSystem ? webkitRequestFileSystem(0, 0, off, on)
    // FF
    : "MozAppearance" in document.documentElement.style ? (db = indexedDB.open("test"), db.onerror = on, db.onsuccess = off)
    // Safari
    : /constructor/i.test(window.HTMLElement) || window.safari ? tryls()
    // IE10+ & edge
    : !window.indexedDB && (window.PointerEvent || window.MSPointerEvent) ? on()
    // Rest
    : off()
}

detectPrivateMode(function (isPrivateMode) {
    console.log('is private mode: ' + isPrivateMode)
})

edit нашел современный, быстрый, synkronas способ попробовать его в firefox (у них нет сервисных работников в приватном режиме), аналогично, например, не включать indexedDB

: "MozAppearance" in document.documentElement.style ? navigator.serviceWorker ? off() : on()

Вот более простой способ определения режима конфиденциальности. Это работает только в Safari. Я создал его, потому что разрабатываемое веб-приложение использует localStorage. LocalStorage недоступен в Safari в режиме конфиденциальности, поэтому мое приложение не будет работать. При загрузке страницы запустите сценарий ниже. Он показывает окно предупреждения, если мы не можем использовать localStorage.

try {
  // try to use localStorage
  localStorage.test = 2;        
} catch (e) {
  // there was an error so...
  alert('You are in Privacy Mode\nPlease deactivate Privacy Mode and then reload the page.');
}

Я решил эту проблему, используя две HTML-страницы. На главной странице задается переменная статуса и устанавливается файл cookie. Вторая страница открывается в новом окне (не вкладка), читает файл cookie и устанавливает статус в значение 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 Browsing, чтобы предотвратить включение вспомогательных объектов браузера (BHO) и расширений браузера, поскольку BHO чаще всего являются вредоносными программами, которые могут изменять веб-страницы, даже если используются HTTPS и сильная аутентификация. Internet Explorer 9 имеет «Отключить панели инструментов и расширения при запуске InPrivate Browsing» в настройках «Конфиденциальность».

Однако это не лучший способ предотвратить распространение вредоносного браузера: вредоносное расширение может изменить поведение главной страницы, чтобы заставить его думать, что значение myCookie не установлено и. Мы ошибочно предположили, что находимся в режиме просмотра InPrivate.

Обратите внимание, что мне нужны файлы cookie для моего приложения, поэтому я не использую InPrivate Browsing для этой цели.


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

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

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

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


Вы не собираетесь блокировать их, если у них нет закрытого браузера.

Почему у вас есть смарт-окно?

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

Я думаю, что самым элегантным решением было бы:

  • Выполните проверку безопасности
  • Если проверка безопасности утечки выявит проблему
    • Сообщите пользователю, чтобы проверить настройки
    • Предложить режим конфиденциальности

Потому что, как вы сказали, не каждый может или должен включить режим конфиденциальности.


Чтобы кто-либо еще сталкивался с этим вопросом, обратите внимание, что с 2014 года нет надежного или точного способа обнаружения, если кто-то просматривает режим инкогнито / приватный / безопасный просмотр через Javascript или CSS. Предыдущие решения, которые когда-то работали, как взлом истории CSS, были впоследствии недоступны для всех поставщиков браузеров.

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

Браузеры, такие как Chrome и Firefox, больше не отключают такие функции, как localStorage. Они просто просуществуют во временном месте, чтобы запретить веб-сайты, которые используют его при ошибках. Когда вы закончите просмотр, пространство имен будет стерто, и ничего не будет сохранено. Если вы тестируете поддержку localStorage независимо от режима, он всегда будет возвращать true для браузеров, которые его поддерживают.

Если это требуется корпорацией, вам необходимо разработать плагин для браузера. Chrome и Firefox, в частности, раскрывают внутренние API, которые позволяют плагинам проверять, находится ли пользователь в режиме приватного просмотра / инкогнито и действий соответственно. Это невозможно сделать за пределами плагина.

Если решение принимается компанией, и это важно, плагин, который просто проверяет, находится ли вы в режиме private / incognito и не позволяет просматривать браузер, пока он не включен, должен быть легким подвигом для любого разработчика, который знает немного Javascript. Затем вы попросите всех сотрудников компании установить этот плагин.







cookies