«Система защиты от парсинга API 2ГИС» — Дмитрий...

Preview:

DESCRIPTION

Когда в базе 1.3 млн. контактов компаний по всей России, неудивительно, что её периодически кто-то пытается распарсить. Здесь возникает проблема: как отличить добропорядочных пользователей от ботов? В своем докладе мы расскажем, как эволюционировала наша система защиты от парсинга. Мы рассмотрим следующие этапы и подходы: — особая локация в Nginx; — PHP + Redis (счетчик по ключу); — Nginx + Redis (конфигурационный файл); — Nginx + Lua + Redis : усложнение логики защиты без снижения скорости ответа. Также мы собираемся рассказать про язык Lua в связке с Nginx не только в случае защиты от парсинга, но и в других частых кейсах, когда не хочется «поднимать» тяжёлое основное приложение. Справочный API 2ГИС — крупнейший REST API в Рунете. Более 300 партнёров, среди которых 2ГИС-Онлайн, Mail.ru, НГС, Е1.ru. Месячная аудитория — 14 млн. Сервис предоставляет информацию об 1.3 млн. фирм и 1.8 млн. POI в 200 городах России, Падуе (Италия), нескольких городах в Украине и Казахстане.

Citation preview

Защита от парсинга поднагрузкой

Дмитрий Бархатов

2gis.ru @rnd2gis

2ГИС

Данные

• 5 стран

• 10 тыс. населенных пунктов

• 5 млн. гео-объектов

• 2 млн. организаций

• 15 тыс. маршрутов

3

Нас парсят

5

Проблемы

Мусорная нагрузка +

Плохая карма

Что делать?

1. IP

NAT

• Студенческая сеть

• Сотовая вышка

9

2. API-ключhttp://api.2gis.ru/search?what=Пиво&where=Москва&key=1234

Ограничение по referer

11

› curl --referer 2gis.ru

Кийя!

3. Аналитикана лету

Анализируем нагрузку• RPS

• Нагрузка в динамике

15

Нагрузка за длительный периодНормальная ситуация

16

Нагрузка за длительный периодПарсер

17

Анализ активности на проекте• Хостинг

• Прачечные

• Школы каскадёров

• Матрасы

• Алмазное бурение

18

Итого по аналитике• Текущая нагрузка

• Кратковременная нагрузка

• Долговременная нагрузка

• Поведение

19

Как делать?

Каменный век — локация в NginX

geo $ban {

213.180.193.49 1;

}

01.

02.

03.

21

Средневековье — PHP + Redis22

Современность — Lua

openresty.org

23

ngx_lua

location / {

content_by_lua '

ngx.say("hello, highload++")

';

}

01.

02.

03.

04.

05.

24

Lua: считаем RPS

http {

lua_shared_dict RPS 10m;

...

01.

02.

03.

25

Lua: считаем RPS

ip = ngx.var.remote_addr

rps = ngx.shared.RPS:incr(ip, 1)

if rps > X then

ngx.shared.BANNED:set(ip, 1)

ngx.exit(444)

end

01.

02.

03.

04.

05.

06.

26

Lua: смотрим динамику

for i = -60, 0 do

-- смотрим данные в хранилище

-- принимаем решение

end

01.

02.

03.

04.

27

Нагрузка в течение сутокLua как поставщик данных

location /get_bad_guys {

content_by_lua '

-- отдаем данные из хранилища

';

}

01.

02.

03.

04.

05.

28

Отстреливаем негодяевif ngx.shared.BANNED:get(ip) then

ngx.exit(444)

end

01.

02.

03.

29

Скорость?

Бенчи голосуют за Lua

http://openresty.org/#Benchmark

http://benchmarksgame.alioth.debian.org/u64/benchmark.php

http://attractivechaos.github.io/plb/

31

1 мс

Да ладно!

1 мс

16000 RPS

Lua (1 мс) vs PHP (15 мс)

Попался, голубчик!

Бан или не бан• Уверены → Бан

• Не уверены → Помогите, люди добрые

38

Когда снимать бан?

Минусы всего подхода• Нет однозначной идентификации

• Бот может замаскироваться

41

Результат

В связи с временными техническими проблемами онлайн-версии

2GIS, мы решили предложить Вам выгодные условия по

приобретению нашей программы: успейте купить парсер организаций

2GIS по цене 2000 рублей вместо 4000 рублей

42

Просто и быстроИспользуйте простые скриптовые языки в связке с NginX с

алгоритмами анализа статистики в реальном времени.

43

Вопросы?

Дмитрий Бархатов

d.barkhatov@2gis.ru

44

Recommended