предисловие
В процессе разработки краулеров часто встречаются проверочные коды.Это очень пороговая мера в процессе анти-сканирования.Стоимость взлома очень высока.Требуется соответствующий опыт, такой как глубокое обучение и реверс-инжиниринг JS, и успех ставка не обязательно очень высока. Даже если взлом будет успешным, если целевой веб-сайт изменит метод или алгоритм генерации кода подтверждения, работа, которая потребовала много усилий для его успешного взлома, будет напрасной. Поэтому взлом проверочного кода, который является античеловеческим, действительно не подходит для новичков.
Итак, какой метод можно использовать, чтобы избежать кода подтверждения и завершить вход? Если метод не работает (не работает), давайте не будем его придерживаться (придерживайтесь), мы можем попытаться принятьобходитьспособ (обходной путь). В этой статье будет представлен простой и осуществимый способ обхода кода подтверждения, который на практике доказал свою эффективность. В настоящее время в Интернете не так много информации об этом методе, и эта статья кратко представит его.
вся идея
Современные веб-сайты, как правило, не требуют от пользователей повторного ввода информации для входа в систему при каждом посещении, но позволяют пользователям напрямую проходить проверку входа при входе во второй раз и напрямую получать доступ к содержимому, зарегистрированному в системе. Так как же это достигается? Веб-сайты обычно хранят некоторую зашифрованную информацию в браузере, подобно тому, как выдают вам карту комнаты с истекшим сроком действия.Каждый раз, когда вы держите эту карту комнаты, вы сканируете ее, когда передаете. Большая часть этой зашифрованной информации существует в виде файлов cookie, которые содержат информацию о сеансе. При доступе файл cookie сравнивается с сеансом в браузере. В случае успеха информация о входе в систему может быть доступна в обычном режиме. Если вы не знакомы с этим механизмом, см.эта статья. И мы используем этот механизм для обхода кода проверки, как показано на следующем рисунке.
Поэтому наша идея состоит не в том, чтобы пытаться взломать код подтверждения, например, с помощью платформы кодирования или самостоятельно разработанного алгоритма глубокого обучения, а в том, чтобы использовать простой метод хранения файлов cookie в браузере, чтобы обойти код подтверждения входа, чтобы достичь наших целей. понять Цель получения данных после входа в систему.
Давайте представим конкретный метод реализации. Общая идея реализации заключается в следующем.
Вкратце шаги следующие:
- Мы получаем файл cookie целевого веб-сайта через браузер (после ввода кода подтверждения для входа в систему);
- Затем используйте подключаемый модуль браузера, чтобы получить из браузера файл cookie, соответствующий целевому веб-сайту;
- Подключаемый модуль браузера отправляет полученный файл cookie в фоновый API;
- API записывает полученный файл cookie в базу данных;
- Сканер получает файл cookie из базы данных и приносит файл cookie с каждым запросом.
Таким образом, мы завершили процесс получения информации о веб-сайте после входа в систему. Среди них базу данных и API в желтой части можно заменить локальными файлами.Конечно, чтобы производственная среда была доступна, мы по-прежнему рекомендуем использовать метод API + база данных.
плагин для браузера
Введение
Плагины браузера — это, в основном, инструменты для расширения функций браузера и позволяющие пользователям реализовать некоторые более практичные функции в браузере. В этой статье будет использоваться подключаемый модуль браузера Chrome, поскольку разработка относительно проста, а количество пользователей также велико.
Плагины Chrome состоят из разных компонентов. Компоненты могут включать фоновые сценарии, сценарии контента, необязательные страницы, элементы пользовательского интерфейса и различные файлы логики. Компоненты плагинов создаются с помощью технологий веб-разработки: HTML, CSS, JavaScript. Компонент плагина будет полагаться на свои собственные функции и может не требовать настройки всех параметров.
развивать
manifest.json
Плагины Chrome разрабатываются изmanifest.json
Начинать. Это похоже на Node.jspackage.json
конфигурационный файл. Этот файл конфигурации сообщит браузеру основную информацию о подключаемом модуле, включая имя, описание, версию и т. д.; он также включает область действия (Scope), разрешения, которыми можно управлять; он также включает файлы ввода и значок информация и т.д.
относительно полныйmanifest.json
следующим образом.
{
"name": "ArtiPub",
"version": "0.1.4",
"manifest_version": 2,
"description": "ArtiPub登陆助手,帮助登陆掘金、SegmentFault、CSDN、知乎等技术平台",
"icons": {
"16": "icon.png",
"48": "icon.png",
"128": "icon.png"
},
"browser_action": {
"default_title": "ArtiPub登陆助手",
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"cookies",
"http://*/*",
"https://*/*",
"storage"
]
}
Более важная частьpermissions
, этот раздел определяет разрешения плагина. Большинство API, включая API хранилища, зарегистрированы вpermissions
поле ниже. Если вы хотите воспользоваться некоторыми функциями, такими как файлы cookie, вы должныpermissions
присоединиться кcookies
это значение.
Пример здесь — плагин для мультипостовой платформы с открытым исходным кодом ArtiPub.manifest.json
.
HTML
спередиmanifest.json
, мы видим другойpopup.html
HTML-файл, который на самом деле является файлом ввода, представляющим HTML-код всплывающего окна, запускаемого подключаемым модулем Chrome при его открытии. Здесь мы можем сделать много статей, таких как встраивание некоторых компонентов пользовательского интерфейса, создание некоторых кнопок, встраивание некоторых необходимых JS-файлов и так далее.
Для удобства мы используем React + TypeScript для разработки пользовательского интерфейса плагина. Окончательный вывод будетpopup.html
,manifest.json
и некоторые другие статические файлы.
Popup.tsx
следующим образом. осторожностьonGetLoginInfo
по методуchrome.cookies.getAllCookieStore
раздел, вот основная логика получения файлов cookie.
import {Button, Card, Input} from 'antd';
import * as React from 'react';
import axios from 'axios';
import './Popup.scss';
interface AppProps {
}
interface AppState {
allowedDomains: string[];
configVisible: boolean;
url: string;
fetched: boolean;
loading: boolean;
}
export default class Popup extends React.Component<AppProps, AppState> {
constructor(props: AppProps, state: AppState) {
super(props, state);
}
componentDidMount() {
// Example of how to send a message to eventPage.ts.
chrome.runtime.sendMessage({popupMounted: true});
this.setState({
allowedDomains: [],
configVisible: false,
url: localStorage.getItem('url') || 'http://localhost:3000',
fetched: false,
loading: false,
});
}
async onGetLoginInfo() {
this.setState({
loading: true
});
// 从后台获取需要的域名
const response = await axios.get(this.state.url + '/platforms');
const platforms = response.data.data;
this.setState({
allowedDomains: platforms.map((d: any) => d.name)
});
// 这里比较重要,是获取 Cookie 的核心逻辑
// 遍历所有 cookieStores
chrome.cookies.getAllCookieStores(cookieStores => {
// console.log(cookieStores);
// 遍历所有 store
cookieStores.forEach(store => {
// 获取该 store 对应的 cookies
chrome.cookies.getAll({storeId: store.id}, cookies => {
// 过滤出需要的域名的 cookies
const data = cookies.filter(c => {
for (let domain of this.state.allowedDomains) {
if (c.domain.match(domain)) {
return true
}
}
return false
});
// 发送 cookies 到后端
axios.post(this.state.url + '/cookies', data)
.then(() => {
this.setState({fetched: true});
})
.finally(() => {
this.setState({loading: false});
});
});
});
});
}
onConfig() {
this.setState({
configVisible: !this.state.configVisible,
})
}
onUrlChange(ev: any) {
localStorage.setItem('url', ev.target.value);
this.setState({
url: ev.target.value,
});
}
render() {
let btn = (
<Button type="primary"
onClick={this.onGetLoginInfo.bind(this)}>
一键获取登陆信息
</Button>
);
if (this.state && this.state.loading) {
btn = (
<Button type="primary" loading={true}>
正在获取
</Button>
)
} else if (this.state && this.state.fetched) {
btn = (
<Button className="success" type="primary">
已成功获取
</Button>
)
}
let input;
if (this.state && this.state.configVisible) {
input = (
<Input value={this.state.url} className="input-url" placeholder="后端地址" onChange={this.onUrlChange.bind(this)}/>
);
}
return (
<Card className="artipub-container">
<h2>
ArtiPub登陆助手
<Button type="primary" shape="circle" icon="tool" className="config-btn"
onClick={this.onConfig.bind(this)}/>
</h2>
{input}
{btn}
</Card>
)
}
}
Плагины упаковки
Здесь обратитесь к ArtiPub'sРепозиторий плагинов. Просто бегите ниже этогоnpm run build
Вот и все. Все упакованные статические файлы будут вbuild
содержание.
плагин импорта
Следующим шагом будет импорт плагина в браузер.
Нажмите «Настройки» в браузере Chrome и нажмите, как показано ниже.Extensions.
Затем нажмите на изображение нижеLoad unpacked
, что означает загрузку несжатого файла. Нажмите и выберите то, что вы только что упаковали и построилиbuild
содержание.
Затем загружается плагин. Вы должны увидеть значок плагина в правом верхнем углу.
Используйте плагины
Перед использованием подключаемого модуля вам необходимо вручную войти на целевой веб-сайт, чтобы убедиться, что файл cookie для входа в систему был сохранен в браузере. Кроме того, вам также необходимо убедиться, что импортер запущен в фоновом режиме.Фоновый API для получения файлов cookie. Затем откройте только что импортированный подключаемый модуль браузера и нажмите «Получить данные для входа одним щелчком мыши», чтобы импортировать его.
Серверный API и база данных
API для получения файлов cookie в фоновом режиме относительно прост, здесь мы кратко покажем его, код выглядит следующим образом.
const models = require('../models')
module.exports = {
addCookies: async (req, res) => {
const cookies = req.body
for (let i = 0; i < cookies.length; i++) {
const c = cookies[i]
let cookie = await models.Cookie.findOne({
domain: c.domain,
name: c.name
})
if (cookie) {
// 已存在该cookie
for (let k in c) {
if (c.hasOwnProperty(k)) {
cookie[k] = c[k]
}
}
} else {
// 不存在该cookie,新增
cookie = new models.Cookie({ ...c })
}
await cookie.save()
}
res.json({
status: 'ok'
})
},
}
Мы используем очень гибкую базу данных MongoDB. Если вы хотите использовать другие базы данных, такие как MySQL, SQLite, это нормально.
рептилия
Здесь мы продолжаем использовать пример ArtiPub. Здесь мы используем Puppeteer в качестве нашего поискового движка. Основной код для установки файлов cookie выглядит следующим образом.
async setCookies() {
const cookies = await models.Cookie.find({ domain: { $regex: this.platform.name } })
for (let i = 0; i < cookies.length; i++) {
const c = cookies[i]
await this.page.setCookie({
name: c.name,
value: c.value,
domain: c.domain,
})
}
}
Если вы хотите увидеть конкретный код сканера, см.GitHub.com/crawl AB-чай…
На самом деле вы уже сохранили соответствующий файл cookie в базе данных, все, что вам нужно сделать, это взять его и применить в запросе к целевому веб-сайту. Независимо от того, какой фреймворк вы здесь используете, например, Scrapy, запросы, все в порядке.
Затем вы можете запустить сканер, чтобы обойти аутентификационные входы.
Суммировать
В этом документе реализован дизайн сканера, который использует подключаемый модуль браузера Chrome для обхода аутентификации при входе в систему. Основная логика этого дизайна заключается в использовании возможности браузера Chrome получать файлы cookie с других доменных имен, а затем применять их к запросу сканера, чтобы обойти код подтверждения входа. По сравнению с непосредственным взломом проверочного кода эта конструкция очень проста, недорога, проста в эксплуатации и имеет очень высокую стабильность и вероятность успеха. ArtiPub, платформа мультипостинга с открытым исходным кодом, использует этот дизайн для обхода проверки входа и публикации статей. Практика показала, что этот метод работает очень хорошо, и каждая платформа может успешно обойти логин. Недостатком может быть то, что требуется некоторый опыт разработки внешнего интерфейса, особенно плагинов для браузера, но это не сложно, и вы можете начать работу за полчаса. В производственной среде в качестве эффективного метода защиты от сканирования можно использовать подключаемые модули браузера. Вы можете попробовать этот метод в поисковых роботах, требующих операций входа в систему.
Ссылаться на
- Руководство по разработке плагинов для Chrome:developer.chrome.com/extensions/…
- ArtiPub: GitHub.com/crawl AB-чай…