Часто возникает ситуация, когда есть огромная база чего-либо и у этой базы нет уникальных символьных кодов, есть только уникальный id. Задача стоит в том, чтобы достать сущность из базы по уникальной ссылке, которую никто случайно не наберет.
Способа 2:
- При создании сущности генерировать уникальный символьный код
- Придумать что-то другое
Первый вариант в целом нормальный, но у нас уже есть огромная база и для существующих записей нужно генерировать коды и создавать генератор кода при создании, потом все тестировать и т.п.
Рассмотрим второй вариант:
Нам необходимо придумать некую соль:
$salt = ''8IU782Uy&62uiHjs2673JHs;
Соль готова. Теперь нам нужно решить 2 задачи. Создать хеш, к примеру: md5(id сущности + наша соль) и сгенерировать ссылку:
/get-entity/id сущности + разделитель + md5(id сущности + наша соль)
Вот так должно получиться:
/get-entity/2984-f70cbbe10ca1fbce22f8fca9dcd270d3
Отлично, ссылка готова. Теперь приступим к выборке и проверке подписи.
Будем работать со второй частью url 2984-f70cbbe10ca1fbce22f8fca9dcd270d3
Из этой строки нам необходимо получить 2 части, а именно id и хеш. Делаем это с помощью функции explode()
Теперь у нас есть id и хеш.
- Пишем код который получит сущность по её id
- Проверяем права с попощью хеша
После того как получили сущность по id, приступаем к проверке. И так, у нас есть хеш который в url и id сущности которую мы достали. Нам нужно будет сгенерировать хеш используя извлеченную сущность md5(id сущности + наша соль) и сравнить её из хеша в url.
if(md5(id сущности + наша соль) == хеша из url){
// все в порядке, ссылка корректная
} else {
// ссылку пытаются подделать
}
В примере я описывал проверку у уже извлеченной сущности, это я делал для наглядности, но проверку можно сделать еще до извлечения, достаточно из url получить id, сгенерировать с помощью него хеш и сравнить с хешем из url.
Вот таким достаточно простым способом можно подписывать сущности и создавать для них безопасные публичные ссылки.