Создание уникальной ссылки для сущности

Александр Д.
01/04/2018

Часто возникает ситуация, когда есть огромная база чего-либо и у этой базы нет уникальных символьных кодов, есть только уникальный id. Задача стоит в том, чтобы достать сущность из базы по уникальной ссылке, которую никто случайно не наберет. 

Способа 2:

  1. При создании сущности генерировать уникальный символьный код
  2. Придумать что-то другое

Первый вариант в целом нормальный, но у нас уже есть огромная база и для существующих записей нужно генерировать коды и создавать генератор кода при создании, потом все тестировать и т.п.

Рассмотрим второй вариант:

Нам необходимо придумать некую соль:

$salt = ''8IU782Uy&62uiHjs2673JHs;

Соль готова. Теперь нам нужно решить 2 задачи. Создать хеш, к примеру: md5(id сущности + наша соль) и сгенерировать ссылку:

/get-entity/id сущности  + разделитель + md5(id сущности + наша соль)

Вот так должно получиться:

/get-entity/2984-f70cbbe10ca1fbce22f8fca9dcd270d3

Отлично, ссылка готова. Теперь приступим к выборке и проверке подписи.

Будем работать со второй частью url 2984-f70cbbe10ca1fbce22f8fca9dcd270d3

Из этой строки нам необходимо получить 2 части, а именно id и хеш. Делаем это с помощью функции explode()

Теперь у нас есть id и хеш.

  1. Пишем код который получит сущность по её id
  2. Проверяем права с попощью хеша

После того как получили сущность по id, приступаем к проверке. И так, у нас есть хеш который в url и id сущности которую мы достали. Нам нужно будет сгенерировать хеш используя извлеченную сущность md5(id сущности + наша соль) и сравнить её из хеша в url.

if(md5(id сущности + наша соль) == хеша из url){

// все в порядке, ссылка корректная

} else {

// ссылку пытаются подделать

}

В примере я описывал проверку у уже извлеченной сущности, это я делал для наглядности, но проверку можно сделать еще до извлечения, достаточно из url получить id, сгенерировать с помощью него хеш и сравнить с хешем из url.

Вот таким достаточно простым способом можно подписывать сущности и создавать для них безопасные публичные ссылки.