Наше приложение для Android только есть логин на Facebook.
Вот что происходит на сервере:
Пользователь создается при отправке запроса POST с помощью маркера доступа Facebook в теле.
Всякий раз, когда пользователь создается с помощью запроса POST, генерируется токен API и отправляется как ответ следующим образом:
{"message":"User Successfully Created","api_token":"ACITyBKf0jKrfqOFumTMcaEEJ8jU151crRdESMPmBj8zbeENslULHfNXlKeo"}
Я сделал это, потому что маркер API, который генерируется на сервере, хранится в локальном хранилище приложения Android и необходим, чтобы сделать другие запросы.
Теперь, если пользователь уже существует на сервере, ответ будет
{"message":"User Already Exists!!","api_token":"ACITyBKf0jKrfqOFumTMcaEEJ8jU151crRdESMPmBj8zbeENslULHfNXlKeo"}
Это в случае, если пользователь удаляет приложение и устанавливает снова.
Теперь для отправки оценки необходимо отправить запрос PATCH с:
Заголовки:
Content-Type:application/x-www-form-urlencoded
api_token:ACITyBKf0jKrfqOFumTMcaEEJ8jU151crRdESMPmBj8zbeENslULHfNXlKeo
fb_id:xxxxxxxxxx
Тело:
distance:2
golds:19
xp:23
(Примечание: я протестировал вышеуказанный запрос, используя почтальон)
Теперь проблема в том, что я заметил лазейку.
Человек может в любое время узнать свой токен доступа к Facebook и свой идентификатор Facebook. Поэтому, если они сделают запрос POST с этим токеном доступа пользователя, они получат api_token (в ответе «Пользователь уже существует!»). И как только у них есть api_token и fb_id, они могут сделать запрос PATCH, чтобы изменить их результаты в соответствии с их желаниями.
Что я делаю неправильно? Как я могу защитить свой сервер от взлома таким образом?
Пожалуйста, помогите мне. Я новичок в разработке API.
Спасибо
Если их токен API доступен для них в приложении вообще, это, вероятно, плохо. Если они недоступны для них в приложении, скажем, они просто подделывают внутрипроцессные POST-запросы и извлекают необработанные данные, то они, вероятно, пытаются взломать или протестировать систему.
Если это так, возможно, отправка незашифрованного ключа API через POST — плохая идея. Если их ключ API — это все, что им нужно, чтобы начать делать что-то плохое в вашей системе, зачем вообще отдавать его им?
Потому что ваше приложение нуждается в этом, чтобы запомнить их. Как насчет чего-то вроде этого:
Новый пользователь, сервер md5 хеширует свой API-ключ и отправляет его на хранение.
Существующий пользователь, сервер md5 хеширует свой ключ API и отправляет его на хранение (при необходимости).
Произошло официальное изменение существующей оценки: приложение re-md5 хэширует уже хешированный ключ API и отправляет его с запросом PATCH. Сервер имеет базу данных с дважды хешированными API-ключами, которые он находит ваш и идентифицирует как пользователя, и с этого момента все происходит нормально.
Других решений пока нет …