Если кто-то спросит вас о технологии сканирования, попросите его прочитать эту статью.

Node.js Python рептилия JavaScript Chrome pyspider

Эта статья была впервые опубликована вмой личный блог, одновременно публикуется в колонке Nuggets, некоммерческая перепечатка, пожалуйста, укажите источник, коммерческая перепечатка, пожалуйста, ознакомьтесь с юридическим заявлением в исходной ссылке.

Интернет — это открытая платформа, которая заложила основу для бурного развития Интернета с момента его рождения в начале 1990-х годов и до наших дней. Однако, поскольку так называемый успех или неудача также невелики, открытые функции, поисковые системы и простые в освоении технологии html и css сделали Интернет самым популярным и зрелым средством распространения информации в области Интернета. коммерческое программное обеспечение, Интернет. Авторские права на информацию о содержании на платформе не гарантируются, поскольку по сравнению с программным клиентом содержимое вашей веб-страницы может быть получено с помощью некоторых программ сканирования, реализованных по очень низкой цене и с очень низкий технический порог, который также является темой, которую мы рассмотрим в этой серии статей —Веб-краулер.

banner

Есть много людей, которые считают, что сеть всегда должна следовать духу открытости и что информация, представленная на странице, должна безоговорочно распространяться по всему Интернету. Тем не менее, я думаю, что в развитии ИТ-индустрии и по сей день веб больше не составляет так называемую конкуренцию pdf.Носитель информации "Гипертекст", это ужеЛегкое клиентское программное обеспечениеидеология существует. С развитием коммерческого программного обеспечения сегодня перед Интернетом стоит проблема защиты интеллектуальной собственности.Представьте, что исходный высококачественный контент не защищен, в онлайн-мире свирепствуют плагиат и пиратство, что на самом деле наносит ущерб здоровому развитию. веб-экосистемы. Также трудно поощрять производство более качественного оригинального контента.

Неавторизованные программы сканирования являются основным виновником вреда экологии оригинального веб-контента, поэтому, чтобы защитить содержимое веб-сайта, мы должны сначала подумать, как предотвратить поиск краулеров.

С точки зрения нападения и защиты рептилий

Самый простой поисковый робот — это HTTP-запрос, поддерживаемый почти всеми серверными и клиентскими языками программирования.Пока HTTP-запрос на получение URL-адреса целевой страницы, полный HTML-документ, когда браузер загружает страницу, может быть Мы называем это "страницей синхронизации".

В качестве защиты сервер может использовать заголовок HTTP-запроса.User-AgentЧтобы проверить, является ли клиент законной программой браузера или скриптовым поисковым роботом, чтобы решить, отправлять ли вам реальную информацию о странице.

Это конечно наименьший педиатрический метод защиты, а рептилий, как атакующую сторону, вполне можно подделатьUser-Agentполей или даже, если хотите, в методе get http, заголовок запросаReferrer,CookieИ так далее, все обходчики легко подделываются.

На этом этапе сервер может использовать отпечаток HTTP-заголовка браузера в соответствии с заявленным производителем и версией браузера (отUser-Agent), чтобы определить, соответствует ли каждое поле в вашем http-заголовке характеристикам браузера, если нет, оно будет рассматриваться как поисковый робот. Типичным применением этой технологии являетсяPhantomJSВ версии 1.x, поскольку нижний слой вызывает сетевую библиотеку фреймворка Qt, заголовок http имеет явные характеристики сетевого запроса фреймворка Qt, который может быть напрямую идентифицирован и перехвачен сервером.

Кроме того, существует более ненормальный механизм обнаружения поисковых роботов на стороне сервера, то есть http-запрос для всех посещенных страниц, вhttp responseпосадить следующийcookie token, а затем проверьте, содержит ли запрос на посещение токен cookie в некоторых интерфейсах ajax, выполняемых асинхронно на этой странице, и верните токен, чтобы указать, что это законное посещение браузера, в противном случае он указывает, что пользователь, которому только что был выдан этот токен. страница html, но без доступа к запросу ajax, вызванному после выполнения js в html, скорее всего, будет сканером.

Если вы напрямую обращаетесь к интерфейсу без токена, это означает, что вы не запрашивали html-страницу, а напрямую инициировали сетевой запрос к интерфейсу, к которому должен обращаться ajax на странице, что явно доказывает, что вы являетесь подозрительным краулером. Известный сайт электронной коммерцииAmazonЭто используемая защитная стратегия.

Выше приведены некоторые подпрограммы, которые можно воспроизвести на основе программы обходчика проверки на стороне сервера.

Обнаружение на основе среды выполнения js на стороне клиента

Современные браузеры предоставляют мощные возможности JavaScript, поэтому мы можем превратить весь основной контент страницы в асинхронные запросы js.ajaxПосле получения данных они отображаются на странице, что, очевидно, повышает порог сканирования контента поисковым роботом. Таким образом, мы перенесли битву сканирования и антисканирования с сервера на среду выполнения js в клиентском браузере.Далее поговорим о технологии сканирования в сочетании с средой выполнения клиента js.

Только что упомянутые различные проверки на стороне сервера имеют определенные технические пороги для программ сканирования HTTP, написанных на обычных языках python и java.В конце концов, веб-приложение — это черный ящик для неавторизованных парсеров.Многое нужно попробовать по крупицам, и набор программ сканирования, разработанных с большим количеством человеческих и материальных ресурсов, поскольку веб-сайт в качестве защитника может легко настроить некоторые стратегии, злоумышленник должен снова потратить то же время, чтобы изменить логику сканирования сканера.

На данный момент вам нужно использовать безголовый браузер, что это за технология? На самом деле, говоря прямо, программа может использовать браузер для доступа к веб-страницам, так что человек, пишущий сканер, может реализовать сложную бизнес-логику сканирования, вызывая API, предоставляемый браузером программе.

На самом деле это не новая технология последних лет, раньше были ядра на базе webkit.PhantomJS, основанный на ядре браузера FirefoxSlimerJS, даже на базе ядра IEtrifleJS, можете посмотреть, если интересноздесьа такжездесьпредставляет собой список коллекции двух безголовых браузеров.

Принцип этих безголовых браузерных программ на самом деле заключается в преобразовании и инкапсуляции некоторых кодов C++ ядра браузера с открытым исходным кодом для реализации простой программы браузера без рендеринга интерфейса GUI. Но общая проблема этих проектов заключается в том, что, поскольку их код основан на магистральном коде определенной версии официального вебкита форка и других ядер, они не могут использовать некоторые из последних свойств css и синтаксиса js, и есть некоторые проблемы с совместимостью, не так хороши, как настоящие Релизная версия браузера с графическим интерфейсом работает стабильно.

Среди них наиболее зрелыми и широко используемыми должны бытьPhantonJS, идентификацию этого краулера я уже писал ранееблог, которые здесь повторяться не будут. У PhantomJS много проблем, потому что это однопроцессная модель, нет необходимой защиты песочницы, а безопасность ядра браузера оставляет желать лучшего. Кроме того, автор проекта объявил о прекращении поддержки этого проекта.

Теперь команда Google Chrome открыта в выпуске Chrome 59.headless mode api, а также вызов с открытым исходным кодом на основе Node.jsбезголовая библиотека хромированных драйверов, я также внесСписок установки зависимостей развертывания среды centos.

Headless Chrome можно назвать уникальным убийцей в Headless Browser, поскольку это сам браузер Chrome, он поддерживает различные новые функции рендеринга CSS и синтаксис времени выполнения js.

Основываясь на этом методе, сканеры могут обойти почти всю логику проверки на стороне сервера в качестве атакующей стороны, но у этих сканеров все еще есть некоторые недостатки в среде выполнения js на стороне клиента, такие как:

Инспекция на основе объектов плагина

if(navigator.plugins.length === 0) {
    console.log('It may be Chrome headless');
}

языковые проверки

if(navigator.languages === '') {
    console.log('Chrome headless detected');
}

На основе экспертизы webgl

var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');

var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);

if(vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {
    console.log('Chrome headless detected');
}

Проверка на основе свойств тонкой линии браузера

if(!Modernizr['hairline']) {
    console.log('It may be Chrome headless');
}

Проверка объектов img, созданных на основе неправильного атрибута img src

var body = document.getElementsByTagName('body')[0];
var image = document.createElement('img');
image.src = 'http://iloveponeydotcom32188.jg';
image.setAttribute('id', 'fakeimage');
body.appendChild(image);
image.onerror = function(){
    if(image.width == 0 && image.height == 0) {
        console.log('Chrome headless detected');
    }
}

Судя по некоторым характеристикам браузера, приведенным выше, он может убить большую часть рынка.Headless Browserпрограмма. На этом уровне порог веб-сканирования фактически повышается, что требует от разработчиков, которые пишут программы-сканеры, изменения кода C++ ядра браузера и перекомпиляции браузера, а вышеуказанные функции важны для браузера. на самом деле не маленькие, если вы пробовали компилироватьБлинк-ядроилиЯдро гекконаВы увидите, как это тяжело для «сценариста»~

Делая шаг вперед, мы также можемUserAgentИнформация о марке, версии и модели браузера, описанная в поле, проверяется на наличие свойств и методов каждого собственного объекта среды выполнения js, DOM и BOM, чтобы наблюдать, соответствуют ли характеристики характеристикам, которые должен иметь браузер этой версии.

Этот способ называетсяПроверка отпечатков пальцев браузераТехнология основана на сборе информации API различных типов браузеров крупными веб-сайтами. Как злоумышленник, который пишет программу-краулер, вы можетеHeadless BrowserПредварительно внедрите некоторую логику js в среду выполнения, чтобы подделать функции браузера.

Кроме того, использование js API на стороне исследовательского браузераRobots Browser Detect, мы нашли интересную маленькую хитрость, вы можете замаскировать предварительно внедренную js-функцию подNative Function, взгляните на следующий код:

var fakeAlert = (function(){}).bind(null);
console.log(window.alert.toString()); // function alert() { [native code] }
console.log(fakeAlert.toString()); // function () { [native code] }

Злоумышленник-сканер может предварительно внедрить некоторые методы js, обернуть некоторые нативные API слоем прокси-функций в качестве ловушек, а затем использовать этот фальшивый API-интерфейс js для покрытия нативного API. Если защитник проверяет это на основе функцииtoStringпозже[native code]проверить, он будет обойден. Поэтому необходимы более строгие проверки, потому чтоbind(null)Кованый метод,toStringза которым следует имя функции без имени функции, поэтому вам нужноtoStringПосле этого проверьте, не пусто ли имя функции.

Какая польза от этого трюка? Чтобы расширить здесь, защитник против захвата имеетRobot DetectСпособ заключается в том, чтобы активно бросатьalert, копия может написать некоторую бизнес-логику, обычные пользователи будут иметь задержку в 1 с или даже дольше, когда они нажимают кнопку «ОК», потому что браузерalertзаблокирует выполнение кода js (фактически вv8он поставит этоisolateКонтекст приостанавливает выполнение аналогично процессу приостановки), поэтому сканер как злоумышленник может использовать описанную выше технику, чтобы предварительно внедрить фрагмент кода js перед запуском всех js на странице и поместитьalert,prompt,confirmВсе всплывающие методы подделаны крючками. Если защитник проверяет свой вызов перед всплывающим кодомalertМетод пока не родной, и дорога перекрыта.

Серебряная пуля против рептилий

В настоящее время наиболее надежными средствами противозахватного и роботизированного досмотра по-прежнему остаютсяпроверяющий кодТехнология. Но проверочный код не означает, что пользователя нужно заставлять вводить ряд буквенно-цифровых символов. Существует также множество вариантов поведения, основанных на использовании мыши, сенсорного экрана (мобильного терминала) и т. д.проверка поведениятехнологии, наиболее зрелой из которых являетсяGoogle reCAPTCHA, отличать пользователей от поисковых роботов на основе машинного обучения.

Основываясь на приведенных выше технологиях идентификации и дифференциации пользователей и поисковых роботов, защитник веб-сайта должен сделать следующее:封禁ip地址Или навязать посетителям этого IP-адреса стратегию сильного проверочного кода. Таким образом, злоумышленник должен приобрести пул IP-прокси для захвата информационного содержимого веб-сайта, в противном случае один IP-адрес легко блокируется и не может быть захвачен. Порог для сканирования и десканирования был повышен доip代理池уровень экономических затрат.

Протокол робота

Кроме того, в области технологии краулинга существует метод «белого пути», который называетсяrobotsпротокол. Вы можете получить к нему доступ в корневом каталоге веб-сайта/robots.txt, например, давайте посмотримпротокол робота github,Allowа такжеDisallowОбъявите авторизацию обхода для каждого искателя UA.

Однако это всего лишь джентльменское соглашение, хотя оно и имеет юридические преимущества, оно может только ограничить программы-пауки этих коммерческих поисковых систем, а вы не можете ограничить этих «диких ползающих энтузиастов».

напиши в конце

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

Атака и защита проверочного кода, упомянутого в этой статье, на самом деле является относительно сложной технической сложностью.Я оставляю здесь интригу.Если вам интересно, вы можете уделить больше внимания и с нетерпением ждать последующих статей для подробной проработки.

Кроме того, друзья, интересующиеся краулингом, могут обратить внимание на один из моих проектов с открытым исходным кодом.webster, В проекте реализована высокодоступная среда сканирования веб-краулера с Node.js в сочетании с безголовым режимом Chrome. Благодаря возможности Chrome отображать страницу, он может захватывать весь асинхронный контент, отображаемый на странице с помощью js и ajax. с Redis для достижения Очередь задач позволяет программам-краулерам выполнять горизонтальное и вертикальное распределенное расширение. Это легко развернуть, я сделалwebsterпредоставляет официальную версиюБазовый образ докера во время выполнения, если вы хотите заглянуть, вы также можете попробовать этодемо-образ вебстера в докере.