Как следует управлять идентификаторами сущностей БД, чтобы избежать рисков для безопасности эффективным способом? - PullRequest
0 голосов
/ 22 февраля 2019

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

// Get user's read books.
public IHttpActionResult GetBooks()
{
    var user = GetLoggedUser();
    var userBooks = BooksRepository.GetByUserId(user.Id);

    return Ok({
        Name: user.Name,
        Books: userBooks.ToDtoList()
    });
}

public IHttpActionResult GetReviews(int bookId)
{
    var reviews = ReviewsRepository.GetByBookId(bookId);

    return Ok({
        Reviews: reviews.ToDtoList()
    });
}

Помимо прочего, объекты обзора имеют свойство ID (целое число), то есть их идентификатор в базе данных.Теперь давайте предположим, что я злонамеренный пользователь, я вхожу в систему и затем начинаю делать что-то вроде:

let limit = 100;

for (let id = someStart; id < (someStart + limit); id++) {
    fetch(URL + '/reviews?bookId=' + id)
        .then( /* getting other users' reviews... */ );
}

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

1 Ответ

0 голосов
/ 22 февраля 2019

Да, есть лучший способ.Держите ваши целочисленные идентификаторы внутренними и никогда не открывайте их клиентам.

Одна вещь, которую я делал в прошлом, даже несколько раз, это добавление столбца GUID при сохранении исходных идентификаторов int.Ваш бэкэнд все еще может функционировать с использованием int ID, но когда дело доходит до предоставления данных клиенту, в этот момент вы только отправляете GUID и никогда не делаете публичные int идентификаторы.Если запрос сделан из браузера, он будет сопровождаться GUID, после чего вы сможете получить int ID, если он вам нужен для чего-то.

Таким образом, вы не меняете свои первичные ключи, все высделать, это добавить новый столбец GUID, а затем предоставить его клиентам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...