Принцип и предотвращение перехвата сети http и перехвата DNS

JavaScript

Феномен

Операторы, хакеры, производители браузеров и производителей мобильных телефонов тем или иным образом вмешивались в веб-страницы, которые обычно посещают пользователи, вставляя рекламу или другие разные вещи. Это особенно распространено в некоторых отдаленных районах и у безымянных операторов.

Принцип захвата сети

  • DNS угонает

一般而言,用户上网的DNS服务器都是运营商分配的,所以在这个节点上,运营商可以为所欲为。 Например, посетите

Вставьте узел js или dom(реклама). (чаще)

Например, как показано ниже:

Что, если меня угонят?

  • Для пользователей самое прямое - пожаловаться оператору.
  • добавить в html<meta http-equiv="Cache-Control" content="no-siteapp"> <meta http-equiv="Cache-Control" content="no-transform " /> Официальное заявление Baidu о запрете транскодирования.
  • Самый полезный способ, использующий HTTPS, не делает данные такими очевидными полосами. https добавляет протокол SSL для шифрования данных.
  • Добавляя фильтрацию кода на разрабатываемую веб-страницу, общая идея состоит в том, чтобы использовать код JavaScript для проверки того, принадлежат ли все внешние ссылки к белому списку.

Существуют различные способы угона:
1. Напрямую вернуть HTML с рекламой
2. Вставляем js в исходный html, а затем размещаем рекламу через js скрипт;
3. iframe отображает исходную обычную веб-страницу.

JS фактическое противостояние

  • Отслеживайте событие DOMNodeInserted в окне, сообщайте о вставленном DOM и анализируйте информацию о вставленном DOM. (Обычно сопоставляются все URL-адреса и сравниваются доменные имена из белого списка одно за другим. Если нет, то определяется, что оно было взломано. Одновременно с отчетом удалите dom.parentNode.removeChild(dom)); Дом только что вставлен. Остерегайтесь случайных травм. Более стабильная работа - сделать мониторинг и статистику, а потом уже принимать решение о профилактике.
    ul.addEventListener('DOMNodeInserted',function (e) {
        console.log(e.srcElement)
        console.log(ul.childElementCount)
    })
    ul.addEventListener('DOMNodeRemoved',function (e) {
        console.log(e.srcElement)
        console.log(ul.childElementCount)
    })

следующим образом:

    function checkDivHijack(e) {
        var dom = e ? e.srcElement : document.documentElement;
        if (!dom.outerHTML) {
            return;     //e不是一个dom,只是插入一段文本
        }
        var imgList = (dom.nodeName.toUpperCase() == 'IMG') ? [dom] : dom.getElementsByTagName('img');
        if (!imgList || imgList.length == 0) {
            return;
        }
        var httpReg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn)\//;
        var base64Reg = /^data:image/;
        var src;
        var hijack = false;
        for (var i = 0; i < imgList.length; i++) {
            src = imgList[i].src;
            if (!httpReg.test(src) && !base64Reg.test(src)) {
                hijack = true;
                break;
            }
        }
     }

    function checkIframeHijack() {
        var flag = 'iframe_hijack_redirected';
        if (getURLParam(flag)) {
            sendHijackReport('jiankang.hijack.iframe_ad', 'iframe hijack: ' + location.href);
        } else {
            if (self != top) {
                var url = location.href;
                var parts = url.split('#');
                if (location.search) {
                    parts[0] += '&' + flag + '=1';
                } else {
                    parts[0] += '?' + flag + '=1';
                }
                try {
                    top.location = parts.join('#');
                } catch (e) {
                }
            }
        }
    }

например:

window.addEventListener('DOMNodeInserted', checkDivHijack);    
function checkDivHijack(e) {
        var html = e ? (e.srcElement.outerHTML || e.srcElement.wholeText) : $('html').html();
        var reg = /http:\/\/([^\/]+)\//g;
        var urlList = html.match(reg);
        if (!urlList || urlList.length == 0) {
            return;
        }
        reg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn|.*\.wanggou\.com)\/$/;
        var hijack = false;
        for (var i = 0; i < urlList.length; i++) {
            if (!reg.test(urlList[i])) {
                hijack = true;
                break;
            }
        }
}

как пройти по дереву дом

function searchDom( node ){
    // 对node 节点处理
    if(node && node.nodeType === 1){
        console.log(node.tagName)
        if(node.tagName === 'IMG'){
            // ...  做白名单判断
        }
    }
    var i = 0, childNodes = node.childNodes, item; 
    for(; i < childNodes.length; i++){
        item = childNodes[i];
        if(item.nodeType === 1){
            // 递归遍历子节点
            searchDom(item)
        }
    }
}

let rootElement = document.documentElement;
(function preTraverse(ele){
    // ele.tagName
    // inViewPort 判断一个元素是否在视口上
    // 遍历dom 树
    if(ele.children && ele.children.length > 0){
    	Array.from(ele.children).forEach(child => preTraverse(child));
    }
    
})(rootElement)

Если вы можете зашифровать js в приложении

Как правило, операторы кэшируют страницы и вставляют коды для продвижения рекламы. Используя обработку политики безопасности содержимого csp,Политика безопасности контента

Ссылка на ссылку
Ссылка на ссылку
HTTPS Hijack

3-5 лет внутренних должностей (Ping An, Lexin, 5 миллионов, vivo, oppo) возможности рекомендации, добро пожаловать, чтобы отправить свое резюме по адресу:zgxie@126.com