privada navegar navegacion modo incógnito incognito hoja gratis google directo chrome celular acceso abrir javascript html security browser cookies

javascript - navegar - Detectando si un navegador está usando el modo de navegación privada



navegacion privada en celular (13)

Estoy construyendo una extranet para una empresa paranoica sobre la seguridad. Quieren asegurarse de que (entre otras cosas) sus usuarios naveguen por el sitio con el modo de navegación privada activado en su navegador web para que no se guarden cookies o historial.

Solo encontré esto http://jeremiahgrossman.blogspot.com/2009/03/detecting-private-browsing-mode.html y https://serverfault.com/questions/18966/force-safari-to-operate-in-private-mode-and-detect-that-state-from-a-webserver

La solución ideal usaría javascript mínimo o nulo. ¿Intentaría establecer una cookie única para todos los navegadores y plataformas? ¿Alguien hizo esto antes?

¡Gracias!

actualizar

http://crypto.stanford.edu/~collinj/research/incognito/ utiliza la técnica CSS visitados de los fingerprinters del navegador mencionados por otros carteles, gracias por los consejos.

Me gusta porque es pequeño y elegante, pero quiero ser capaz de hacerlo sin javascript si es posible.


Aquí está mi opinión sobre la detección de modo privado

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 encontró una forma moderna, más rápida, synkronas de probarlo en firefox (no tienen trabajadores de servicio en modo privado) similar a ie, no incluyen indexedDB

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


Aquí hay una manera más fácil de detectar el modo de privacidad. Esto funciona solo en Safari. Lo creé porque una aplicación web que estoy desarrollando usa localStorage. LocalStorage no está disponible en Safari cuando está en modo de privacidad, por lo que mi aplicación no funcionará. En la carga de la página, ejecute el script a continuación. Muestra un cuadro de alerta si no podemos usar 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.''); }


Bueno, en realidad no distinguirías el modo privado de "bloquear todas las cookies" de esa manera, pero aparte de esa rara situación, creo que debería funcionar.

El gran problema de la OMI, es que este es un diseño de sitio muy malo, no mejor que el bueno "necesita navegador xxx para ver este sitio web" que era común en los años 90. No todos los navegadores tienen un modo de navegación privada (por mucho que desprecie a IE, por ejemplo, a sus usuarios de IE7) y esos usuarios no podrán acceder a su sitio.

Además, cuando estoy en Internet, a menudo tengo varias pestañas abiertas con múltiples sitios web. Sería realmente molesto para mí tener que cambiar al modo privado solo para ver ese sitio web y no poder acceder a los otros sitios al mismo tiempo.

Una cosa que podría hacer sería diseñar el sitio usando sesiones en lugar de cookies, para que no se almacenen (ya que no las usa ...). Y en cuanto a la historia ... realmente, ¿cuál es el problema con eso?


El truco localStorage es un error que se ha solucionado y ya no funciona en Safari 11.0.

Existe una alternativa interesante que funciona en Safari, Opera e Internet Explorer (no en Chrome): el navegador envía un encabezado DNT: 1 (No rastrear).

No es 100% confiable porque este encabezado se puede habilitar para la navegación normal (está deshabilitado de forma predeterminada), pero puede ayudar a identificar a los usuarios conscientes de la privacidad.


Escriba el código para lograr lo siguiente

1) En la versión del navegador de prueba de Firefox. Este método funciona con la versión> = 33.0 (admite trabajadores de servicio). No se puede usar este método con versiones antiguas (<33.0).

2) Intente configurar el trabajador de servicio. 3) Si puede configurar, usar o acceder a un trabajador del servicio, está 1000% en modo de navegación privada, ya que los trabajadores del servicio no pueden interactuar en el modo de navegación privada de Firefox. Ojalá pudieran serlo

Citar:

"En Firefox, las API de Service Worker están ocultas y no se pueden usar cuando el usuario está en modo de navegación privada"

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


Estoy de acuerdo con la opinión de DigitalSeas de que, en general, no debemos tratar de detectar si el usuario se encuentra en un modo de "navegación privada". Sin embargo, recientemente descubrí que Firefox ahora se suscribe a un servicio llamado "disconnect.me", que proporciona la lista negra url que utilizan en su función de "protección de seguimiento" . Dado que disconnect.me pone en la lista negra a ciertas redes sociales (por ejemplo Facebook.net de facebook.net ), descubrimos que sus SDK no se cargarían en Firefox. Por lo tanto, parece razonable que podamos tratar de detectar el modo de navegación privada para proporcionar un mensaje de error más útil y preciso a nuestros usuarios.

Con esa justificación fuera del camino, esta esencia afirma proporcionar detección para la navegación privada en los principales navegadores utilizando trucos específicos para esos navegadores. En el momento de escribir estas líneas (la esencia puede haberse actualizado en el momento de leer esto), la lógica de detección es la siguiente:

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


He resuelto este problema usando dos páginas HTML. La página principal define una variable de estado y establece una cookie. La segunda página se abre en una nueva ventana (no en una pestaña), lee la cookie y establece el estado en el valor de la cookie. En MSIE, el valor de la cookie se pasa a la página secundaria cuando la página principal está en modo normal. Cuando está en el modo de navegación InPrivate, el valor de la cookie no se pasa a la página secundaria (pero se pasa si abre una pestaña nueva).

La página 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>

La página child.html :

Detecting MSIE''s InPrivate Browsing mode... <script> window.opener.myCookie=document.cookie; window.close(); </script>

Estoy usando el modo de navegación InPrivate para evitar que se activen los objetos del navegador (BHO) y las extensiones del navegador, ya que los BHO son a menudo malwares que pueden modificar las páginas web incluso si se usan HTTPS y autenticación fuerte. Internet Explorer 9 tiene una "Deshabilitar barras de herramientas y extensiones cuando se inicia la Exploración InPrivate" en su configuración de "Privacidad".

Sin embargo, esta no es la mejor manera de prevenir la extensión maliciosa del navegador: una extensión maliciosa puede cambiar el comportamiento de la página principal para hacer que piense que el valor de myCookie no se ha establecido y. Supondríamos erróneamente que estamos en el modo de navegación InPrivate.

Tenga en cuenta que necesito cookies para mi aplicación, así que no uso InPrivate Browsing para ese fin.


Los navegadores web se comportan de manera diferente cuando el modo de privacidad está activado.

En muchos navegadores, el almacenamiento en caché de recursos es limitado. Es posible detectar dónde se ha basado un navegador en su caché de CSS. Es posible realizar este ataque sin JavaScript .

El EFF está trabajando en un proyecto para explorar huellas dactilares . Las partes de la huella digital de los navegadores serán diferentes cuando se active el modo de privacidad. Adelante, pruébalo .


No estoy seguro de si su causa es antigua, pero Firefox proporciona documentación sobre cómo detectar el modo de navegación privada . Sin embargo, implica el uso de una importación de sus 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; } }


No hay forma de que su página web sepa, absolutamente seguro, que el usuario está en modo de navegación privada. Cualquier intento de verificar varias características del navegador deberá cambiar a menudo a medida que se actualicen las implementaciones de seguridad. Puede funcionar durante algún tiempo en algunos navegadores, pero no en todos.

Si a la compañía le preocupa la seguridad, le sugiero que distribuya su propia distribución de Firefox o Chromium con la configuración de privacidad bloqueada, y solo permita que ese cliente personalizado se conecte a la extranet.


Para cualquier persona que se encuentre con esta pregunta, tenga en cuenta que a partir de 2014, no existe una manera confiable o precisa de detectar si alguien está navegando en un modo de navegación de incógnito / privado / seguro a través de Javascript o CSS. Las soluciones anteriores que alguna vez funcionaron como el hack de historial de CSS se han vuelto inutilizables por todos los proveedores de navegadores.

Nunca debe haber una situación en la que sea necesario detectar el modo de navegación privada en un sitio web cotidiano normal. Las personas eligen navegar de forma anónima y / o no anónima por sus propios motivos.

Los navegadores como Chrome y Firefox ya no deshabilitan funcionalidades como localStorage. Simplemente lo nombran en una ubicación temporal para evitar que los sitios web que lo usan se salgan. Una vez que haya terminado de navegar, el espacio de nombres se borrará y no se guardará nada. Si está probando el soporte de almacenamiento local independientemente del modo, siempre será verdadero para los navegadores que lo admitan.

Si es requerido internamente por una empresa, debe desarrollar un complemento de navegador. Chrome y Firefox, en particular, exponen API internas que permiten que los complementos comprueben si el usuario está en modo privado de navegación / incógnito y actúan en consecuencia. No se puede hacer fuera de un complemento.

Si la empresa toma la decisión y es importante, un complemento que simplemente compruebe si está en modo privado / de incógnito y le impide navegar hasta que se encienda debería ser una tarea fácil para cualquier desarrollador que conozca un poco de Javascript. Luego, le pediría a todos los empleados de la compañía que instalen este complemento.


Es posible detectar modos de navegación privados habilitados para la mayoría de los navegadores usados. Esto incluye Safari, Firefox, IE10, Edge y Google Chrome.

Firefox

Cuando el modo de navegación privada de Firefox está habilitado, IndexedDB arroja un InvalidStateError porque no está disponible en el modo de navegación privada.

Para muy si eso:

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

Safari

Para Safari, la clave es el servicio de almacenamiento local. Está deshabilitado en modo de privacidad. Intente acceder a él y use una cláusula try-catch. El siguiente método funciona tanto en dispositivos OSX como iOS. Los créditos para este método van a esta pregunta y respuesta

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 / Edge

Internet Explore incluso va a desactivar el IndexedDB cuando se encuentre en modo de privacidad. Así que comprueba la existencia. Pero eso no es suficiente, porque los navegadores más antiguos tal vez ni siquiera tienen un BID. Así que haga otra comprobación, por ejemplo, para eventos que solo IE10 y el navegador subsiguiente tienen / desencadenan. Una pregunta relacionada sobre CodeReview se puede encontrar here

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

Cromo

El sistema de archivos puede verificar el modo Chromes Incognito. Una gran explicación se puede encontrar aquí en 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 });


No los bloqueará si no tienen habilitada la navegación privada.

¿Por qué tener un cuadro de mensaje inteligente en absoluto?

¿Intentaría establecer una cookie única para todos los navegadores y plataformas? ¿Alguien hizo esto antes?

Creo que la solución más elegante sería:

  • Realice una prueba de fuga de seguridad
  • Si la prueba de fugas de seguridad revela un problema
    • Dile al usuario que verifique la configuración
    • Sugerir modo de privacidad

Porque como dijiste, no todos pueden o necesitan activar el modo de privacidad.