LINUX.ORG.RU

Не допустить читерства на backend

 , , , ,


0

1

Доброго времени суток.

Есть проект на django, отдельно от него есть проекты на angular и react. На django есть система вознаграждений и она хранит так же вознаграждения за проведённое время в приложениях на angular/react. Разумеется для учёта этого времени из фронта делаются запросы на api django, чтобы сохранить результат.

Исходные данные — используется JWT (т.е. мы в принципе знаем, когда токен был получен (время жизни токена 15мин), так же есть refresh token). Нужно хранить 5-тиминутные отрезки времени. Т.е. пользователь провёл 5 минут — шлём запрос. Запросы с большим временем тоже можно, но меньше времени жизни токена (15мин).

Теперь вопросы и проблемы:

1) допустим токен был получен в 21.00, но это был refresh token и пользователь на самом деле был на сайте с 20.57 и, соответственно, в 21.02 придёт запрос на запись 5 минут. Как это валидировать? дать возможность 5 минутного сдвига до времени получения токена?

2) и более важный — это же простой xhr запрос с фронта. В принципе пользователь может изучить ключи этиз запросов и из какого нибудь postman/insomnia или обычным curl слать запросы постоянно — как защититься от этого?

Используется django rest framework + rest framework simplejwt. Production инстансы на domain.tld — django, subdomain1.domain.tld — клиент 1 и второй так же. Т.е. по идее можно было бы ограничить по хосту запросы, чтобы урегулировать второй вопрос. Кто-то делал подобное?

Каждую секунду проверяй. А как ты хотел? Народ ушлый.В принципе ну напишут тебе бота и будет всё то же самое. Единственный вариант, это установить полный контроль над средой исполнения. Желательно в запертой комнате без окон и интернета, с камерами слежения.

anonymous ()

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

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

Упоротая тема, прикольно, чот меня не отпускает. Токен можно врендеривать шаблонизатором прямо в жопоскрипт, желательно в более-менее рандомное место, и так же врендеривать флажок выбора алгоритма хеширования или подписания. А чтобы запутать прошареного юзера, ещё один токен можно врендеривать в страничку и его тоже оправлять.

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

Пользователь всегда предполагается умный, кто-то, да найдётся. Изменять токен нет смысла, т.к. пользователь с помощью пары email/password получает его и может делать refresh сам, как это делает фронтэнд, например. Так же мы не может на фронте изменить токен, т.к. он просто не пройдёт валидацию на бэкенде.

conformist ★★★ ()
Ответ на: комментарий от WitcherGeralt

Приложения на react/angular работают со своим бекэндом на nodejs.

conformist ★★★ ()
Ответ на: комментарий от Pravorskyi

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

conformist ★★★ ()
Ответ на: комментарий от anonymous

Мне пришла в голову достаточно простая идея. В запросе есть payload, мы просто в него добавим ещё один ключ, типа «hash»: «something» и этот something будет сгенерирован по шаблону на фронте и расшифровываться на бекэнде, если не совпадёт — шлём ошибку в sentry и знаем, что пытается играть нечестно.

conformist ★★★ ()
Ответ на: комментарий от conformist

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

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

а давать вознаграждения только за реальные действия — кнопку нажал, значит шевелится

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

conformist ★★★ ()

Чувак, это невозможно. Пользователь может прикрутить бота на уровне ОС, т.е. генерировать события мыши и клавиатуры (тупо макрос в цикле с рандомными имитовставками для движений/нажатий), или даже на уровне железа. Ты в браузере это никак не поймёшь, а тем более на сервере. Разве что анализировать все действия пользователя на корреляцию, но надёжность будет далеко не 100% и будут ложные срабатывания. Оно тебе надо?

no-such-file ★★★★★ ()
Ответ на: комментарий от conformist

Вот этот запрос мне нужно валидировать

Зачем тебе его валидировать? В запросе есть уже токен, т.е. пользователь взаимодействовал с приложением (иначе JWT токен он не получил бы). Дальше «определением реальных действий будет заниматься фронт».

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Согласен. Если пользователь сделает такое — окей. Но это не так просто и такой случай мы пока не рассматриваем. А вот слать каждые 5 минут post запрос на бекенд — такой скриптик можно написать за полминуты, вот от этого хотелось бы защититься.

conformist ★★★ ()
Ответ на: комментарий от conformist

определением реальных действий будет заниматься фронт

Только не в браузере, т.к. весь клиентский код открыт и доступен к изучению.

Причин простоя пользователя может быть много, например, у чела проблемы со стулом, он бы рад в сервисе посидеть, да надо бежать в сортир, а он на улице, да и вифи там не ловит.

Нужно оценивать фактическое использование фронта, т.е. реальное взаимодействие. И вот там уже решай, читерит пользак или нет.

Ну или ты не все рассказал про условия.

deep-purple ★★★★★ ()
Ответ на: комментарий от conformist

Вот и не опирайся на эту пятиминутодолбилку совсем.

deep-purple ★★★★★ ()
Ответ на: комментарий от conformist

такой скриптик можно написать за полминуты

Обфускация кода фронта + одноразовые url для получения токена и уже за 5 минут не получится, придётся вникать где и как закопан этот url. Проще будет именно макрос накатать.

no-such-file ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.