Sqids: короткие URL-безопасные ID для Laravel

Sqids — это библиотека для преобразования одного или нескольких неотрицательных чисел в короткую строку, безопасную для использования в URL. Она является преемником Hashids и поддерживается более чем на 40 языках программирования, благодаря чему идентификатор, созданный в PHP, можно декодировать в JavaScript, Python, Rust и других языках при одинаковых настройках. Для работы PHP-версии требуется PHP 8.1 и расширение gmp либо bcmath.

Одно из наиболее распространённых применений — скрытие последовательных идентификаторов базы данных в публичных URL. Вместо адресов вроде /invoices/1 и /invoices/2, которые позволяют легко определить количество записей и перебирать их, можно использовать закодированное значение.

Установка

Установите пакет через Composer:

composer require sqids/sqids

Кодирование и декодирование чисел

Конструктор Sqids не требует обязательных параметров. Метод encode() принимает массив чисел, а decode() возвращает исходные значения.

use Sqids\Sqids;

$sqids = new Sqids();

$id = $sqids->encode([7, 8, 9]); // "ylrR3H"

$numbers = $sqids->decode($id); // [7, 8, 9]

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

Минимальная длина идентификатора

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

Чтобы все идентификаторы имели одинаковую длину, можно использовать параметр minLength:

use Sqids\Sqids;

$sqids = new Sqids(minLength: 12);

$id = $sqids->encode([7, 8, 9]);

// "ylrR3HjJRet1"

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

Использование собственного алфавита

Sqids позволяет определить собственный набор символов. Это изменяет итоговые идентификаторы и создаёт дополнительный уровень обфускации.

use Sqids\Sqids;

$sqids = new Sqids(
    alphabet: 'k3G7QAe51FCsPW92uEOyq4Bg6Sp8YzVTmnU0liwDdHXLajZrfxNhobJIRcMvKt',
);

$id = $sqids->encode([7, 8, 9]);

// "fbmzYm"

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

Блокировка нежелательных слов

В библиотеку встроен список распространённых нежелательных слов. Если сгенерированный идентификатор содержит одно из них, Sqids автоматически создаёт альтернативное значение.

Также можно указать собственный список запрещённых комбинаций:

use Sqids\Sqids;

$sqids = new Sqids(
    blocklist: ['fbmzYm']
);

// Будет возвращён другой идентификатор
// без использования запрещённого значения

$id = $sqids->encode([7, 8, 9]);

Пример использования в Laravel

Sqids удобно применять для скрытия первичных ключей в ссылках.

Генерация идентификатора

use App\Models\Post;
use Sqids\Sqids;

$post = Post::findOrFail(123);

$sqids = new Sqids();

$urlId = $sqids->encode([$post->id]);

$url = route('posts.show', $urlId);

// /posts/Nj8x7K

Декодирование в контроллере

use App\Models\Post;
use Sqids\Sqids;

public function show(string $id)
{
    $sqids = new Sqids();

    $decoded = $sqids->decode($id);

    $post = Post::findOrFail($decoded[0]);

    return view('posts.show', compact('post'));
}

Пример основан на механике кодирования и декодирования Sqids, описанной в документации библиотеки.

Когда стоит использовать Sqids

Sqids хорошо подходит для:

  • кодирования первичных ключей базы данных;

  • публичных идентификаторов в URL;

  • сокращения ссылок;

  • объединения нескольких числовых значений в один идентификатор;

  • временных токенов и ссылок для входа.

Когда Sqids использовать не следует

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

Поэтому библиотека не подходит для:

  • хранения секретных данных;

  • защиты персональной информации;

  • реализации контроля доступа;

  • замены механизмов авторизации.

Для таких задач необходимо использовать полноценное шифрование и проверку прав доступа.

Похожие статьи

Рекомендательные технологии Подробнее
Разработка и инструменты 5 месяцев назад

Как добавить SSH-ключ в аккаунт GitHub

Подробное руководство по добавлению SSH-ключа в аккаунт GitHub: генерация ключа, его добавление в агент, копирование и регистрация на сайте GitHub. Практические шаги для безопасного подключения к репозиториям без пароля.

Разработка и инструменты 5 месяцев назад

Условные операторы if else в Bash и shell-скриптах

Использование условных операторов if, else и elif в shell-скриптах Bash. Рассматриваются базовый синтаксис, числовые и строковые сравнения, проверки файлов, вложенные условия и практические примеры для повседневных задач администрирования и автоматизации.