Я создаю проект, в котором пользователь может войти или зарегистрироваться, но я только что обнаружил брешь в безопасности.
Сначала позвольте мне рассказать потоку, когда пользователь получил токен с сервера,
Пользователь может зарегистрироваться или войти в систему, если все проверки верны, сервер ответит:
{
"meta": {
"issueDate": 1592078419167,
"expToken": "10800000"
},
"payload": {
"user": {
"id": 3,
"email": "new3@gmail.com",
"username": "new3"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MywiZW1haWwiOiJuZXczQGdtYWlsLmNvbSIsInVzZXJuYW1lIjoibmV3MyIsImlhdCI6MTU5MjA3ODQxOSwiZXhwIjoxNTkyMDg5MjE5fQ.cjLgQjc2QbIhgumG2X2VsLk70c58F7NrKboYL2F2Sa0"
}
}
затем с этим токеном он может выполнять операции CRUD, присоединяя его к заголовку как схему Authorization: 'bearer TOKEN'
. С токеном на месте промежуточное ПО на сервере проверяет, не было ли оно подделано или истекло (я использую здесь JWT), если его срок истек или подделан, а затем ответ сервера с 401 unauthorized
.
Но вот что я заметил. Допустим, у меня есть таблицы USERS
и POSTS
(1: N). User1 имеет 2 сообщения с идентификаторами 1 и 2 соответственно, затем другой пользователь регистрируется, позволяет называть его User2, User2 регистрируется, успешно получил токен, затем переходит на терминал, использует curl, отправляет запрос на маршрут api/post/1/edit
, которого он не делает своя. Вот и моя проблема. Пользователь, знающий, как работает Интернет / API, может просто взять токен и получить доступ к любому ресурсу.
У меня есть несколько решений.
создать промежуточное ПО, которое проверяет если пользователь владеет ресурсом, запрашивая базу данных. Но я не думаю, что это эффективное решение, потому что мне нужно запрашивать и делать это на другом контроллере, таком как users_controller, posts_controller, another_controller.
вместо увеличения идентификатора я буду использовать UUID, поэтому всякий раз, когда они пытаются получить доступ к маршруту редактирования сообщений, они не могут легко определить идентификатор. как api/post/1akA13124S5129/edit
<--- это сложно понять. </p>
Надеюсь, моя проблема ясна. Любые решения будут оценены. Огромное спасибо. <3 </p>
PS: Я пробовал на facebook, не работает. Я думаю, у них много токенов и куки. Кстати, я не использую и не включаю файлы cookie по любому запросу.