LINUX.ORG.RU

Генерация ID как на YouTube: зачем это надо и как это сделать?

 ,


2

1

youtube.com/watch?v=xxxxx...

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

Второе, - сорт сокращения URL, можно заменить каждое 10-ое число буквой a, каждое 28 буквой z, ну и так далее, вплоть до спец символов. Вместо длинющего 10000000 получить грубо говоря AAAZ==.

Но не смотря на все эти ухищрения, не все сайты делают правильно, они делают ID из набора букв, но... заменив букву «a» на следующую по алфавиту «b» мы получаем по сути тот-же инкремент +1, и по можно зайти по любому адресу, запросив любой ID объекта. Вот например Reddit: https://www.reddit.com/comments/3xp8s2. От ID тут одно название. Можно делать инкремент букв руками.

Немножко погуглив нашёл такую функцию, alphaID: http://kvz.io/blog/2009/06/10/create-short-ids-with-php-like-youtube-or-tinyurl/

alphaID() генерирует из числа — слово, и наоборот, превращает слово — в число. Для сокращения нормально, но проблему безопасности, защиты от брутфорса оно не решает. Буквы просто заменяются на следующие по таблице ASCII и таким образом инкрементом перебираются все объекты.

Каким же образом генерировать псевдо-случайные ID? И надо ли это делать?

Не хочу использовать рандом, потому что рано или поздно такой рандом упрётся в бесконечный цикл, когда все возможные варианты N-значных ID уже сгенерированы и записаны в БД, а для новых осталось совсем немного свободных вариантов. В общем, плохо.

Нужно, если генерировать, то реально псевдо-рандом как на YouTube, а не просто инкрементальные a -> b делать.

Кто-нибудь может поделиться рецептом?

★★★★★

uuid? Если ссылки публично дуступны, то все равно можно будет их все скравлить чем-нибудь.

zz ★★★★
()

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

Nucleus-
()

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

Spoofing ★★★★★
() автор топика

От ID тут одно название.

У тебя каша в голове.

И надо ли это делать?

Раз спрашиваешь, значит не нужно.

German_1984 ★★
()
Ответ на: комментарий от Spoofing

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

Ты мне больше не подружка, Ты мне больше не дружок, Забирай свои игрушки И не писай в мой горшок!

iz_tabakerki
()
Ответ на: комментарий от Spoofing

очень крутой способ генерации ID из чисел и обратно,
но никому его не скажу

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

серьезно — эта твоя «защита от брутфорса» имеет строго отрицательную полезность.

t184256 ★★★★★
()

Первое что приходит в голову ... Второе

А нулевое — непрерывную цифровую последовательность нельзя использовать в произвольной распределённой системе. А YouTube — это не один сервер.

KRoN73 ★★★★★
()
Ответ на: комментарий от iz_tabakerki

Я пошутил.

Шутка, шутка. ШУТКАААААА!!!

Spoofing ★★★★★
() автор топика

Берём число 31337, пусть это comment_id в нашей БД. Берём текущую дату «now».

Кодируем, получаем уникальный ID для использования в URL-адресах: 8kf4h31pxl

Который невозможно забрутфорсить, потому что помимо ID нужно знать ещё и дату/время: то есть, выборку из БД нужно обязательно делать по ID и дате/времени вместе. Алсо, дата и время в данном случае так же выполняют роль «соли».

И этот уникальый ID мы можем вернуть взад, получив наше comment_id обратно в 31337.

<?php echo spfng_uri_encode(31337, 'now'); ?>
<br>
is
<br>
<?php echo spfng_uri_decode(spfng_uri_encode(31337, 'now'), 'now')[0]; ?>

ID получается всегда разный, потому что время идёт. Ты можешь добавлять на сайт комментарии каждую секунду — у всех будет генерироваться разный ID.

Если у кого-то есть идеи лучше — с радостью выслушаю.

Код:

function spfng_uri_encode($id = 0, $strtotime = '1970-01-01 00:00:00') {
  if (is_numeric($id) === false) {
    return false;
  }
  if (($strtotime = strtotime($strtotime)) === false) {
    return false;
  }
  $id = strrev($strtotime).(int) $id;
  $hash = base_convert($id, 10, 36);
  if (substr($id, 0, 1) === '0') {
    return substr_replace($hash, '_', rand(0, (strlen($hash) - 1)), 0);
  }
  return $hash;
}

function spfng_uri_decode($hash, $timestamp = '1970-01-01 00:00:00') {
  if (strpos($hash, '_')) {
    $hash = str_replace('_', '', $hash);
  }
  if (($hash = base_convert($hash, 36, 10)) === false) {
    return false;
  }
  if (($timestamp = (int) strrev(strtotime($timestamp))) === false) {
    return false;
  }
  return array(substr($hash, strlen($timestamp)), strrev(substr($hash, 0, (strlen($timestamp) - 1))));
}
Spoofing ★★★★★
() автор топика
Ответ на: комментарий от iz_tabakerki

На самом деле нет.

Это было последней каплей, помощи на ЛОРе не дождёшься. Больше никому помогать не стану тоже.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Предлагаю тебе разработать свои криптографические алгоритмы, ты гений.

Deleted
()
Ответ на: комментарий от t184256

ни за что не отреверсите!

в этом вся правда.

вы добавили комментарий на сайт, открыли его, а там адрес: 1xdxbqm8ve97t

добавили ещё один комментарий, а у него адрес: j8r2zzglk0mh

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

тоже самое со ссылками на ютубе, они генерируются столь хитро, что никому не приходит в голову «как брутфорсить все видео подряд по ID?».

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

Spoofing ★★★★★
() автор топика
Последнее исправление: Spoofing (всего исправлений: 1)
Ответ на: комментарий от KRoN73

тоже правда. каждая буква /watch?v=XXXXXX это может быть адрес/имя/хост сервера, куда помещается видео.

программа распределяет каждое видео на первый же сервер посвободнее, и весь адрес ?v=XXXXXXX это путь серверов, который проходит загружаемый видеофайл и где он хранится.

тогда и гадать на счёт ID не нужно. :)

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

тоже самое со ссылками на ютубе, они генерируются столь хитро, что никому не приходит в голову «как брутфорсить все видео подряд по ID?».

Никому не приходит в голову ЗАЧЕМ брутфорсить все видео подряд по ID?

greek_31 ★★
()
Ответ на: комментарий от greek_31

зачем брутфорсить все файлы подряд на файловых хостингах? а вдруг хоуммэйд прон найдёшь? или документы какие важные...

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

А зачем брутфорсить все файлы подряд на youtube?

anonymous
()

Не хочу использовать рандом, потому что рано или поздно такой рандом упрётся в бесконечный цикл, когда все возможные варианты N-значных ID уже сгенерированы и записаны в БД, а для новых осталось совсем немного свободных вариантов. В общем, плохо.

Просто увеличивай N. Можешь автоматически — после определённого числа неудачных попыток. Это если тебе важны максимально короткие URL-ы. Зачем они тебе могут быть важны, я не знаю. Лучше всего просто генерируй 128-битное случайное число и кодируй его во что-нибудь вроде base64. Оно не повторится, будет длиной около 22 символов, по-моему идеальный вариант.

Legioner ★★★★★
()

hashids

generate short unique ids from integers

available in JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Objective-C, C, C++11, D, F#, Go, Erlang, Lua, Haskell, Elixir, Rust, ColdFusion, Groovy, Kotlin, Nim, VBA, ActionScript, CoffeeScript, Bash, R and for Node.js & .NET

Atheist ★★★
()
Ответ на: комментарий от Spoofing

зачем брутфорсить все файлы подряд на файловых хостингах? а вдруг хоуммэйд прон найдёшь? или документы какие важные...

Уникальные id в качестве защиты? - Вредно.

pi11 ★★★★★
()
Ответ на: комментарий от greek_31

Никому не приходит в голову ЗАЧЕМ брутфорсить все видео подряд по ID?

«согласно статистике на февраль 2012 года, в минуту на Youtube загружается 60 часов видео» :) Жаль, нет статистики за 2015, но не удивлюсь, если за эти три года темпы выкладывания раз в 5-10 выросли :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Atheist

We need ids to be nice and friendly especially if they end up being in the URL.

Therefore, the algorithm tries to avoid generating most common English curse words by never placing the following letters (and their uppercase equivalents) next to each other:

c, s, f, h, u, i, t

This is done by using them as separators.

Лол! А у спуфи такого нет! :)

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
openssl bf -pass pass:$(dmidecode -s system-uuid) -a -nosalt <<<$fileno
DonkeyHot ★★★★★
()
Последнее исправление: DonkeyHot (всего исправлений: 1)

Насколько помню лекции по алгоритмизации, настойчиво предлагался следующий вариант: генерируется диапазон (pool) случайных айдишников (к примеру, от 0000 до 9999 или от AAAA до BBBB), после чего равномерным распределением формируем случайный вариант из диапазона и проверяем его существование в списке уже заюзанных вариантов.

При малом количестве уже сгенерированных вариантов шансы получить новый уникальный вариант довольно высоки и статистически скрипту не придётся висеть в постоянном цикле генерации.

При заполнении pool'a на 60% и более необходимо выделить новый pool, расширив диапазон для генерации.

При данном подходе довольно просто распараллелить большое количество подобных серверов, позволяя генерировать им новые элементы без коллизий между собой, просто разделяя диапазоны и периодически проверяя заполненность pool'a.

ThisNameWasFree
()
Ответ на: комментарий от ThisNameWasFree

Генерировать готовые к использованию ID'шники небольшими диапазонами — отличная идея! Спасибо.

Я идиот, не додумался, а одно время было пытался сгенерить всё подряд через Bash: {A,Z}{A,Z}{A,Z}{A,Z}{A,Z}

Spoofing ★★★★★
() автор топика
30 января 2016 г.

Не хочу использовать рандом, потому что рано или поздно такой рандом упрётся в бесконечный цикл, когда все возможные варианты N-значных ID уже сгенерированы и записаны в БД, а для новых осталось совсем немного свободных вариантов.

ORLY?

$x = rand(100000000, 999999999); - для тебя с головой хватит.

drull ★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.