Anti Adblock 의 기본적인 원리 중 하나 및 회피법
Posted 2018. 4. 10. 19:59, Filed under: 개발/JavaScriptAnti Adblock 이란?
어떤 웹사이트에 들어갔을 때 Adblock 이나 Ublock 등의 광고 차단 확장기능을 이용 중이라면, 위와 같은 화면이 뜨는 경우가 있다. 일반적으로 위와 같은 기능을 하는 것을 Anti-Adblock 이라고 부른다.
Anti Adblock 회피하기
몇 가지 Anti-Adblock 툴 들은 Anti-Adblock Killer(https://reek.github.io/anti-adblock-killer/) 등의 툴로 회피가 가능하다. 자세한 설명은 생략.
하지만 창과 방패의 싸움이다보니 적용이 뒤늦게 되거나 안 되는 것들도 많다.
아래에 소개할 방법은 만약 위 화면이 웹사이트에 들어가자마자 바로 뜨는 것이 아니라, 만약 조금이라도 어떤 시간 간격을 가지고 뜬다면 적용할 수 있는 방법 중 하나이다.
기본인 Anti-Adblock 툴의 작동 원리는 다음과 같다. 대부분의 광고 차단 확장기능에서 차단하도록 되어있는 id, class 등을 가진 엘리먼트를 동적으로 생성한 뒤, 해당 요소가 정상적으로 존재하는지 확인한다. 만약 해당 엘리먼트가 동적으로 생성되었으나 차단되어 확인할 수 없을 경우 광고 차단 확장기능을 사용하는 것으로 판단하고 위와 같은 페이지를 띄워준다.
따라서... 해당 엘리먼트를 특정 웹사이트에서 차단하지 않도록 필터를 만들어주면 위와 같은 프로그램을 회피할 수 있다.
대부분의 광고 차단 확장 프로그램에서는 위 그림과 같이 필터 로그를 확인할 수 있다. 웹사이트에 접속한 시간은 19:58:51 인데, 약 3초 뒤에 3개의 DOM 요소가 동적으로 생성되었고, 그 것을 차단한 것이다.
그렇다면? 내 필터에 아래와 같은 필터를 추가하여, 특정 웹사이트에서 위 엘리먼트를 차단하지 않도록 허용해주면 된다.
site.url#@##banner_ad site.url#@##ad-inner site.url#@##ad_728
위와 같은 필터 추가 규칙에 대한 더욱 자세한 룰은 아래 링크의 Exception rule 을 확인한다. 대부분 확장 기능에서 필터 규칙은 호환된다.
https://adblockplus.org/en/filters#elemhide_exceptions
다만... 위와 같은 방법으로 필터를 한 개 또는 두세개만 추가해도 바로 문제없이 사용 가능한 경우가 있기도 하고, 그렇지 않은 경우도 많다.
엄청 많은 엘리먼트 이름 리스트에서 순차적 또는 랜덤으로 선택하여 해당 엘리먼트를 생성하는 경우가 있었다. 따라서 단순히 위 방법으로는 수십개를 추가해도 안 되는 경우가 있을 수 있다. 그럴 경우에는 소스코드를 분석해서 위 dom 생성을 체크하는 스크립트를 찾아 차단시켜야 하는데 보통 숨겨놓아서 찾기 힘들게 되어있다. 내 경우에는 일단 모든 자바스크립트 로드를 일단 먼저 차단하고, 인라인으로 선언된 코드들도 차단한 다음, 랜덤으로 허용해보다 보면 문제를 발생시키는 js를 찾을 수 있는 경우가 있었다. 이러한 작업에는 먼저 소스코드를 분석해야 하고, 원하는 작업을 할 수 있도록 확장기능을 만들거나 Userscript를 사용하여 웹사이트를 제어해야했는데, 일반 사용자가 할 수 있는 일은 아닐 것이다.
그 외에 여러가지 방법이 가능하겠지만 다른 간단한 방법들로는 해당 사이트에서 자바스크립트 사용이 필요 없을 경우 해당 사이트를 이용할 때 자바스크립트를 끄거나, 해당 웹사이트에 대하여만 수동으로 필터를 추가하는 것 등이 있겠다. 다만 수동으로 필터를 차단하는 경우, 보이지 않는 광고요소나 프로그램이 동작할 수 있으므로, 해당 사이트가 신뢰할 수 없는 사이트라면 사용해서는 안 되는 방법일 것이다. 이 경우 로그를 확인하여 dom 요소가 랜덤으로 생성되기 전에 어떤 광고가 필터링 되었는지 확인한 다음 해당 필터들을 먼저 적용하고 넘어가면 되는데, 만약 악성 프로그램이 해당 웹사이트에 일정 시간 이상 체류한 뒤에 동작하도록 되어있다면 이것도 여전히 문제가 될 수 있다 하겠다.
사실 맘먹고 커스텀하면 어떻게든 Adblock 필터를 뚫을 수 있고, 스크립트를 복잡하게 꼬아놔서 분석을 어렵게 하면 분석하는 것도 어려우므로 아예 자바스크립트를 차단하는 것 말고는 방법은 없을 것 같다.