170 похожих чатов

Всем привет! Кто какие айди использует для объектов в бд? Мы

раньше использовали в postgres просто Integer c autoincrement (это primary key, на него настроены foreign keys' с других таблиц)
Но есть проблема, так как айди легко угадать, можно просто перебрать все айди от 1 до X, и получить информацию о всех объектах (по специфике работы необходим публичный доступ к одному из объектов по айди, это окно оплаты)
Сейчас мы планируем использовать просто айди типа String, созданные из питона через модуль secrets

Есть ли какие-то минусы такого подхода, или в данном случае действительно лучше не сделаешь?

21 ответов

22 просмотра

Для такой задачи существует uuid

Алексей- Автор вопроса
Artyom 🇷🇺
Для такой задачи существует uuid

Но ведь это все равно строка, и по идее все, что меняется, это метод генерации, а в нашем случае токен, созданный через secrets лучше, чем uuid

минусов никаких нет, просто нужнен инсерт с while true и генерацией нового айди на ошибку

Алексей- Автор вопроса
fishsouprecipe 👉👈
минусов никаких нет, просто нужнен инсерт с while ...

А точно нужен? Через secrets вроде же гарантированно криптографически уникальный токен

Алексей
А точно нужен? Через secrets вроде же гарантирован...

А можешь сказать что именно в secrets юзаешь, посмотрю срц. Но что-то мне подсказывает, что такое невозможно)

А если и uuid угадают? Нужна авторизация + проверка на возможность доступа к данным у авторизованного пользователя.

Посмотрите на UUID.

Алексей- Автор вопроса
Makc Belousow
А если и uuid угадают? Нужна авторизация + проверк...

Но шанс угадать uuid/уникальный в разы меньше, чем просто перебрать число в диапазоне

Алексей
Но шанс угадать uuid/уникальный в разы меньше, чем...

если тебе нужен ограниченный доступ, то тут только authorization, зачем полагаться на рандом

Алексей- Автор вопроса
fishsouprecipe 👉👈
если тебе нужен ограниченный доступ, то тут только...

Нет, не ограниченный доступ. Система авторизации с OAuth scopes есть, там все нормально (токены авторизации тоже через secrets создаются, не uuid же для них использовать) Просто есть окно оплаты, где пользователь условно открывает example.com/i/{someid} Ну и для оплаты понятное дело не нужно авторизироваться, поэтому доступ к конкретному одному объекту (ладно, двум)) по айди открыт Все остальное защищено авторизацией Вот поэтому и нужно что-то более-менее нормальное для URL, базы и сложное для подбора Насчет UUID или secrets, я наверное выберу secrets Но все же исходный вопрос: primary key в таблице лучше делать строкой, или все же числом?

Из минусов, secrets может быть долгий. Попробуйте померить скорость генерации uuid4 и ваших строчек через secrets. Вдруг это будет существенно.

Алексей
Нет, не ограниченный доступ. Система авторизации с...

О. недавно платил, через какую-то кассу, там айди платежа был uuid4

Алексей- Автор вопроса
fishsouprecipe 👉👈
О. недавно платил, через какую-то кассу, там айди ...

Я смотрю наших примерные аналоги, у них явно не uuid, а что-то похожее на secrets

я использую ULID - Universally Unique Lexicographically Sortable Identifier, в бд (postgres) храню как uuid4

Алексей- Автор вопроса
Alexey
я использую ULID - Universally Unique Lexicographi...

Звучит интересно, спасибо, посмотрю

Алексей- Автор вопроса
Oskar Sharipov
Из минусов, secrets может быть долгий. Попробуйте ...

Хм, возможно и так. В данный момент разницы нет, но может в будущем будет влиять. uuid генерируется примерно в 21 раз быстрее

Алексей- Автор вопроса
fishsouprecipe 👉👈
кажется нужно переписать на го)

Не) Ну пока неизвестно что лучше, буду думать, может ещё кто напишет. Но уже точно решил, что это будут строки, не числа)

fishsouprecipe 👉👈
кажется нужно переписать на го)

И там обращения к системному ГПСЧ будут долгими.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта