Какой хороший способ «замаскировать» прогрессивный идентификатор? - PullRequest
1 голос
/ 27 марта 2020

В нашей CRM у нас есть страница PHP, которая, учитывая 6-значный git идентификатор счета (например, 314529), выбирает строки продукта и итоги из базы данных и печатает счет.

Для реализации некоторые умные рабочие меры мы теперь сделали на этой странице генерации счетов-фактур c, поэтому мы можем отправить клиенту ссылку на счет-фактуру, например, https://example.com/get-invoice.php?id=314529

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

Моя идея заключалась в том, чтобы создать случайный UUID и сопоставить его с фактическим номером счета-фактуры в нашей базе данных, чтобы клиенты не может «угадать» счета других людей.

CREATE TABLE email_invoice (
 public_uuid VARCHAR(128) UNIQUE,
 actual_order_id INT
);

Какой эффективный и безопасный способ реализовать этот уникальный идентификатор? Должен ли я MD5 ID счета-фактуры и подстроки или полагаться на PHP uniqid?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Как стартер: вы должны управлять уровнем авторизации в вашем приложении; каждый пользователь должен пройти проверку подлинности, и права доступа проверяются при попытке доступа к хранимым данным.

При этом добавление некоторого запутывания поверх этого также не является плохой вещью. Ваш вариант использования выглядит как хорошее место для использования UUID() или UUID_SHORT().

Эти функции создают уникальные, непредсказуемые идентификаторы, которые, как вам кажется ищем. Вы можете просто использовать столбец UUID вместо первичного ключа.

Недостатком является то, что вычисление этого ключа с автоинкрементным вычислением обходится дороже, и что нет никакой возможности сгенерировать значение по умолчанию в запросах insert.

create table email_invoice (
    id varchar(36) primary key,
    email_id int,
    invoice_id int
); 

insert into email_invoice(id, email_id, invoice_id) values(uuid(), 1, 2);

Демонстрация на DB Fiddle :

id                                   | email_id | invoice_id
:----------------------------------- | -------: | ---------:
b86d0d8b-7022-11ea-8095-00163e561f6d |        1 |          2

Вы также можете создать Триггер before, который назначает uuid() для каждой вставки, поэтому вам не нужно беспокоиться о вызове функции в самом операторе.

1 голос
/ 27 марта 2020

Аутентификация клиента в веб-запросе и проверка его подлинности перед выдачей результата.

У вас есть небезопасная прямая ссылка на объект . Есть несколько способов предотвратить это.

Рекомендовать привнести некоторый опыт в области веб-безопасности в разработку вашей CRM, так как это довольно грубая c ошибка.

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