스크립트를 통해 Chrome이 시크릿 모드인지 확인할 수 있나요?


114

스크립트를 통해 Chrome이 시크릿 모드인지 확인할 수 있습니까?

편집 : 실제로 사용자 스크립트를 통해 가능하다는 것을 의미했지만 답변은 JavaScript가 웹 페이지에서 실행되고 있다고 가정합니다. 사용자 스크립트와 관련하여 여기 에서 질문을 다시했습니다 .


28
incognito당신이 그것을 쉽게 결정할 수 있다면 그것은 그리 좋지 않을 것입니다 :)
Aren

그리고 사용자가 확장 매뉴얼에 대해 시크릿 모드를 허용해야한다는 것을 기억해야합니다. 기본적으로 모든 것이 참입니다.
Mohamed Mansour

@Mohamed : 허용해야하는 사용자는
저일 것이므로


1
@PeteAlvin 또는 사이트는 시크릿을 감지하여 가치를 떨어 뜨릴 수 있습니다. Boston Globe의 사이트는 기사를 시크릿으로 표시하지 않기 때문에 사용자가 무료 기사 할당량을 피할 수 없습니다. 일반적으로 나에 대해 잘 모르는 사이트를 선호합니다.
JohnC

답변:


232

예. 시크릿 모드에서는 FileSystem 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
이것은 최소한의 해킹 방식이며 최상위에 있어야합니다. 깨끗하고 우아합니다.
Tom Teman 2015 년

1
@ user2718671 jsfiddle.net/w49x9f1a 는 Mac OSX의 최신 Chrome에서 여전히 잘 작동합니다. 이상한 ...
Alok

1
나는 크롬을 시도했다. 작동하지만 논리는 거꾸로입니다.
Lucas Massuh

9
이는 곧 덕분에 멀리 갈 것입니다 이러한 커밋
blueren

8
크롬 V 77.0.3865.90 실패
Gitesh Purbia

18

한 가지 방법은 고유 한 URL을 방문한 다음 해당 URL에 대한 링크가 CSS에서 방문한 것으로 취급되는지 확인하는 것입니다.

"시크릿 감지" (불량 링크) 에서 이에 대한 예를 볼 수 있습니다. .

위의 시크릿 감지 링크를 대체하는 동일한 저자의 연구 논문

에서 main.htmliframe을 추가,

 <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이 "안전하지 않은 자바 스크립트"를 외칠 수 있습니다. 그러나 웹 서버에서 제공하는 것은 작동합니다.


꽤 멋지네요. 시크릿 모드가 방문한 링크를 강조 표시하지 않는다는 것을 몰랐습니다. 그래도 사용자는 링크를 클릭해야합니다.
Igor Zevaka

1
아니요, iframe이 링크를 "클릭"합니다.
kibibu

40
대부분의 브라우저는 자바 스크립트를 통해 : visited 스타일 정보를 노출하지 않기 때문에 실제로 작동하지 않습니다. CSS 인터페이스는 링크에 방문하지 않은 색상이있는 것처럼 표시됩니다. 이것은 적어도 2010 년 이후로 WebKit 및 Gecko 브라우저에서 사용 된 보안 조치입니다. 이것은 사용자의 기록을 보호하기위한 것입니다 (예 : 가능한 모든 URL을 시도하고 방문한 URL을 제 3 자에게 보낼 수 있음). URL의 토큰에 대한 액세스 및 기타).
Timo Tijhof

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 도움말 페이지에서 :

  • 시크릿 상태에서 연 웹 페이지와 다운로드 한 파일은 탐색 및 다운로드 기록에 기록되지 않습니다.
  • 열었던 모든 시크릿 창을 닫으면 모든 새 쿠키가 삭제됩니다.

웹 페이지를 방문한 일반 브라우징과 시크릿의 차이가 발생하는 것을 알 수 있듯이이 모드 에서는 브라우저가 서버와 통신하는 것이 없습니다.

여기에있는 것과 같은 여러 HTTP 요청 분석기 중 하나를 사용하여 브라우저가 서버에 정확히 무엇을 보내는 지 확인할 수 있습니다 . 일반 세션과 시크릿 간의 헤더를 비교하면 차이가 없습니다.


최근에는 사용자가 시크릿 안전으로 특별히 표시 한 확장 프로그램을 제외한 모든 확장 프로그램을 비활성화합니다.
Tiberiu-Ionuț Stan

4

확장 프로그램을 개발하는 경우 탭 API를 사용하여 창 / 탭 시크릿인지 확인할 수 있습니다.

자세한 내용은 여기 에서 확인할 수 있습니다 .

웹 페이지로 작업하는 경우 쉽지 않으며 그렇게되도록 설계되었습니다. 그러나 incongnito에서는 데이터베이스 (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');

이 모습 매우 흥미로운 내가 익숙 해요 및 Windows 10에 내 넷빈즈 8.2 IDE에 의해 지원되지 않는 것 같습니다하지만 일에 그것을 얻을 수 있다면, 나는 또한 궁금 것을 자바 스크립트의 한 형태이다 : 나는 대체 할 수 reject('Check incognito failed')resolve(false)내가 원하는 경우는 isIncognito참 또는 거짓 인 부울이 되려면? 감사.
라이언

2
을보고 항상 함수 내에 있어야 Syntax Error: await is a reserved word한다고 생각 합니다. 그래서이 코드가 작동하지 않는다고 생각합니다. awaitasync
라이언

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 's Answer를 기반으로 한 빠른 복사-붙여 넣기 기능 (참고 : 비동기식)

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

더 이상 작동하지 않습니다 (과거에 작동했을 수도 있음)
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에서 동영상을 재생할 수 없습니다.
ILikeTacos

확인 된 <Chrome> : "시크릿 모드 오류 브라우저가 시크릿 모드 인 것 같습니다."
Pete Alvin

사실을 말하지 않기 때문에이 게시물이 개선 될 수 있다고 생각합니다. 이 답변에서 이미 위아래로 입증되었으므로 누군가가 시크릿 모드 또는 일반 크롬 브라우저에서 방문했는지 확인하고 싶은지 알 수 있습니다.
FortuneSoldier

@ILikeTacos 귀하의 댓글이 4 년 이상 된 것을 알고 있지만 Chrome은 의도적으로 시크릿 감지 기능을 해제했기 때문에 여전히 내가 이겼습니다 ..
Puppy

@Puppy 음 네. 그러나 실제로 더 mishravikas.com/articles/2019-07/... 없습니다
Cruncher의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.