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

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

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



답변

예. 시크릿 모드에서는 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"));
    }


답변

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


답변

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


답변

JavaScript에서 JHurrah의 답변을 볼 수 있습니다 . 링크를 강조 표시하지 않는 것을 제외하고 모든 시크릿 모드는 검색 기록과 쿠키를 저장하지 않습니다. Google 도움말 페이지에서 :

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

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

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


답변

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

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

웹 페이지로 작업하는 경우 쉽지 않으며 그렇게되도록 설계되었습니다. 그러나 incongnito에서는 데이터베이스 (window.database)를 열려는 모든 시도가 실패한다는 것을 알게되었습니다. 이는 시크릿 모드에서는 사용자 컴퓨터에 데이터 흔적이 남지 않기 때문입니다.

나는 그것을 테스트하지 않았지만 localStorage에 대한 모든 호출도 실패한다고 생각합니다.


답변

이것은 비동기 코드가 플래그를 설정할 때까지 기다리는 약속을 사용하므로 나중에 동기식으로 사용할 수 있습니다.

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


답변

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