веб-сервисы — отслеживание звонков на PHP WebService для каждого пользователя / IP

По сути, у меня есть PHP веб-сервис, который будет доступен с:

  • Веб-сайт
  • клиенты мобильных телефонов — (android / iphone)

Данные получены в JSON формат. Запрос отправлен с помощью GET метод окончен HTTPS протокол. Данные в базе данных хранятся в mongo база данных.

Вот мои основные вопросы:

  1. Я хочу получить статистику по каждому user — сколько звонков он делает в минуту / час — как сохранить эти данные? Будет ли хорошо, чтобы сохранить все в mongo база данных? (Статистика за 1 день = 43 миллиона строк) Возможно, существует решение, которое будет хранить данные только в течение X дней, а затем автоматически обрезать все?

  2. Я также хочу получить статистику по каждому IP — сколько звонков было сделано с него в минуту / час / день — как сохранить эти данные? Будет ли хорошо, чтобы сохранить все в mongo база данных? Не станет ли оно слишком большим?

  3. Это всегда можно увидеть IP пользователя, который звонит в веб-сервис? как насчет IPv6?

Эти 3 вопроса являются наиболее интересными для меня в настоящее время. Я планирую позволить пользователям использовать базовые сервисы без необходимости входа в систему! Моя главная проблема — производительность базы данных / файловой системы.

Далее идет описание о том, какие меры я планирую использовать. Как я пришел к этому решению и почему эти 3 вопроса выше необходимы. Не стесняйтесь игнорировать текст ниже, если вы не заинтересованы в деталях 🙂

Я хочу защитить свой веб-сервис от сканирования. кто-то может передать параметры (которые нетрудно догадаться), чтобы получить все данные из моей базы данных 🙂

Вот пример использования: https://mydomain/api.php?action=map&long=1.23&lat=2.45

Как видите — я уже использую безопасный https протокол, во избежание случайного отлова всего GET запрос. Он также защищает от атак «человек посередине». Тем не менее, это не мешает злоумышленникам проникнуть на сайт и пройти через JS AJAX звонки, чтобы получить фактическую структуру запроса. Или декомпилировать весь Android .APK файл.

Прочитав много вопросов через Интернет — я пришел к выводу, что нет никакой возможности полностью защитить мои данные, но я думаю, что нашел способ сделать жизнь сканеров намного сложнее!

И мне нужен ваш совет по поводу того, стоит ли реализовывать все это и какие технологии следует использовать в моем случае (см. Далее).

Далее следуют меры безопасности против использования сервиса, не связанного с веб-сайтом (мобильное устройство), для пользователей, которые не вошли в систему.

<?php
/*
Case: "App first started". User: "not logged in"0. generate UNIQUE_APP_ID for APP when first started
1. send UNIQUE_APP_ID to server (or request new UNIQUE_APP_ID from server to write it on device)
1.1. Verify how many UNIQUE_APP_IDs were created from this IP
if more than X unique values in last Y minutes ->
ban IP temporary
ban all UNIQUE_APP_IDs created by IP during Y minutes (use delay to link them together).
but exclude UNIQUE_APP_IDs from ban if these are not showing strange behaviour ( mainly - no calls to API)
force affected users to log-in to continue to use the service or ask to retry later when ban wears off
else register UNIQUE_APP_ID on server

Note: this is a 'hard' case, as the IP might belong to some public Wi-Fi AP. Precautions:
* temporary instead of permanent ban
* activity check for each UNIQUE_APP_ID belonging to IP. There could be legit users who use the service from long time thus will not be affected by this check. Created Z time ago from this IP.
* users will be not be ever banned - rather forced to log-in, where more restrictive actions will be performed individually!

Now that the application is registered and all validations are passed:

2. Case: "call to API is made". User: "not logged-in"2.1. get IP from which call is made
2.2. get unique app ID of client
2.3. verity ID against DB on server
if not exists -> reject call
2.4. check how many calls this particular ID did in the last X minutes
if more than X calls -> ban only this unique ID
2.5 check how many Ids were banned from this IP in the last X minutes. If more than Y then ban new calls for whole IP temporary
check if all banned IDs were created from the same IP, if yes then also ban that IP, if it is different from new IP*/
?>

Как видите, все мое решение основано на идее, что я могу хранить данные о веб-сервисе и легко извлекать их для анализа … для каждого отдельного вызова веб-сервиса … Или, может быть, для каждого X-го вызова. Понятия не имею — какую базу данных использовать. Я думал, что монго может быть не лучшим выбором. Может быть MySQL? Обеспечение безопасности данных от неправильных пользователей является одной из причин. Другая причина заключается в том, что злоупотребление использованием базы данных приведет к огромной нагрузке на базу данных. (DDos?) Итак, я думаю, что это может быть хорошей идеей для подсчета вызовов веб-службы.

На другой стороне. Немного расчетов.

Если есть 1000 пользователей, работающих одновременно. Каждый генерирует 30 звонков на веб-сервис в минуту. Это 30000 записей на диск в минуту. За час это в 60 раз больше, т.е. за час записывается 1 800 000 дисков. Если я планирую вести статистику ежедневного использования, то это в 24 раза, то есть в
в среднем на сервере будет храниться 43 200 000 записей для целей отслеживания.

Каждая запись содержит информацию о: time + IP + user unique ID

Я также думал о том, чтобы вообще не хранить никаких данных. использование redis вместо. Я знаю, что есть какая-то counter существует. Для каждого отдельного IP я могу создать отдельный ключ и начать считать звонки. В этом случае все будет храниться на сервере RAM, Также есть expire date параметр, который можно установить для каждой клавиши. А для отдельных пользователей я могу хранить их идентификаторы вместо сетевых IP. Это решение пришло мне в голову только после того, как я закончил писать все это эссе, поэтому позвольте мне услышать ваши идеи по поводу вопросов выше.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]