스크립트를 통해 Chrome이 시크릿 모드인지 확인할 수 있습니까?
편집 : 실제로 사용자 스크립트를 통해 가능하다는 것을 의미했지만 답변은 JavaScript가 웹 페이지에서 실행되고 있다고 가정합니다. 사용자 스크립트와 관련하여 여기 에서 질문을 다시했습니다 .
스크립트를 통해 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.html
iframe을 추가,
<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.html
iFrame에로드됩니다.
<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이 "안전하지 않은 자바 스크립트"를 외칠 수 있습니다. 그러나 웹 서버에서 제공하는 것은 작동합니다.
:visited
: hacks.mozilla.org/2010/03/…
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');
reject('Check incognito failed')
와 resolve(false)
내가 원하는 경우는 isIncognito
참 또는 거짓 인 부울이 되려면? 감사.
Syntax Error: await is a reserved word
한다고 생각 합니다. 그래서이 코드가 작동하지 않는다고 생각합니다. await
async
reject
호출되면 예외가 발생하고 값이 반환되지 않으므로 isIncognito
항상 그렇 true
거나 false
코드가 작성되는 방식입니다. 그러나 값을 반환하려면 거기에서 '해결'을 사용할 수도 있습니다. 그리고 환경이 글로벌 범위에서 어떻게 대기하는지에 따라 달라질 수 있습니까? 그것은 전역 범위에서 크롬 콘솔에서 작동하지만 당신은 포장의 모든 것을 시도 할 수 (async function() { 'everything here' })();
는 비동기 함수 내에서 실행됩니다 그래서
isIncognito
결과 대신 약속을 저장하고 나중에 비동기 함수에서 실행할 수 있습니다. let isIncognito = new Promise( ...etc
그러면 다른 곳에 다음과 같은 함수가있을 것입니다.(async function() { if( !(await isIncognito) ) {alert('not 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') });
다음은 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)
여기 약속을 사용하는 솔루션
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))
시크릿 모드에 대한 설명서에는 웹 사이트가 다르게 작동하지 않을 것이라고 구체적으로 나와 있습니다. 나는 이것이 대답이 아니오라는 것을 의미한다고 믿습니다.
incognito
당신이 그것을 쉽게 결정할 수 있다면 그것은 그리 좋지 않을 것입니다 :)