개발자모드차단 및 DevTools 실시간 감지 스크립트
개발자모드차단을 위해 다중 감지 기법 기반의 DevTools 실시간 탐지 로직을 적용한 클라이언트 보호 스크립트입니다.
브라우저 분석 환경이 감지될 경우 즉시 DOM 무력화 및 강제 리다이렉트를 수행하여 무단 디버깅 및 코드 분석을 차단합니다.
[code]
(function(){
var devOpen = false;
function redirect(){
if(devOpen) return;
devOpen = true;
try{ document.documentElement.innerHTML = ''; }catch(e){}
window.location.replace('about:blank');
}
setInterval(function(){
var s = performance.now();
console.profile(); console.profileEnd();
if(performance.now() - s > 120) redirect();
}, 800);
function detectSize(){
if(window.outerWidth - window.innerWidth > 140) redirect();
if(window.outerHeight - window.innerHeight > 140) redirect();
}
window.addEventListener('resize', detectSize);
setInterval(detectSize, 500);
setInterval(function(){
var s = performance.now();
(function(){ debugger; })();
if(performance.now() - s > 80) redirect();
}, 800);
(function(){
var el = new Image();
Object.defineProperty(el, 'id', { get: function(){ redirect(); } });
setInterval(function(){ console.dir(el); }, 1000);
})();
(function(){
var fn = function(){ return 1; };
var org = fn.toString();
setInterval(function(){ if(fn.toString() !== org) redirect(); }, 1000);
})();
if(window.top !== window.self) redirect();
document.addEventListener('contextmenu', function(e){ e.preventDefault(); });
document.addEventListener('keydown', function(e){
if(e.key === 'F12') redirect();
if(e.ctrlKey && e.shiftKey && ['I','J','C','K'].indexOf(e.key) !== -1) redirect();
if(e.ctrlKey && (e.key === 'u' || e.key === 'U')) redirect();
if(e.metaKey && e.altKey && e.key === 'I') redirect(); /* Mac */
});
})();
[/code]
단, 100% 막는 건 불가능합니다. 브라우저마다 우회 방법이 존재하므로 억제/불편하게 만드는 수준으로 이해하시면 됩니다.
브라우저 분석 환경이 감지될 경우 즉시 DOM 무력화 및 강제 리다이렉트를 수행하여 무단 디버깅 및 코드 분석을 차단합니다.
[code]
(function(){
var devOpen = false;
function redirect(){
if(devOpen) return;
devOpen = true;
try{ document.documentElement.innerHTML = ''; }catch(e){}
window.location.replace('about:blank');
}
setInterval(function(){
var s = performance.now();
console.profile(); console.profileEnd();
if(performance.now() - s > 120) redirect();
}, 800);
function detectSize(){
if(window.outerWidth - window.innerWidth > 140) redirect();
if(window.outerHeight - window.innerHeight > 140) redirect();
}
window.addEventListener('resize', detectSize);
setInterval(detectSize, 500);
setInterval(function(){
var s = performance.now();
(function(){ debugger; })();
if(performance.now() - s > 80) redirect();
}, 800);
(function(){
var el = new Image();
Object.defineProperty(el, 'id', { get: function(){ redirect(); } });
setInterval(function(){ console.dir(el); }, 1000);
})();
(function(){
var fn = function(){ return 1; };
var org = fn.toString();
setInterval(function(){ if(fn.toString() !== org) redirect(); }, 1000);
})();
if(window.top !== window.self) redirect();
document.addEventListener('contextmenu', function(e){ e.preventDefault(); });
document.addEventListener('keydown', function(e){
if(e.key === 'F12') redirect();
if(e.ctrlKey && e.shiftKey && ['I','J','C','K'].indexOf(e.key) !== -1) redirect();
if(e.ctrlKey && (e.key === 'u' || e.key === 'U')) redirect();
if(e.metaKey && e.altKey && e.key === 'I') redirect(); /* Mac */
});
})();
[/code]
단, 100% 막는 건 불가능합니다. 브라우저마다 우회 방법이 존재하므로 억제/불편하게 만드는 수준으로 이해하시면 됩니다.
|
댓글을 작성하시려면 로그인이 필요합니다.
댓글 3개
개도구 감지는 구조적으로 우회가 가능해서
"차단"이라기보다 사용성을 제한하는 수준에 가깝고,
돔 파괴와 강제 리다이렉트는 오탐 시 정상 사용자 경험을 직접적으로 훼손할 수 있다.
보호가 목적이라면 클라이언트 억제보다는 우회가 어려운 지점에 방어를 두는 편이 더 적절해 보인다.
개발자에게 권장할 설계 방향은 아니다. ?