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 не является средством шифрования. Любой, кто знает используемый алфавит и алгоритм, может декодировать идентификатор обратно в числа.

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

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

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

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

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

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

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

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

Что можно автоматизировать с помощью Bash: реальные сценарии и примеры

Подробный разбор возможностей Bash с практическими примерами: резервное копирование, деплой, мониторинг, обработка CSV, управление Docker и автоматизация серверных задач.

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

Laravel AI SDK: создавайте умные приложения с ИИ

Laravel AI SDK - что это, как установить, как он работает и чем полезен разработчикам. Показаны ключевые возможности для создания интеллектуальных AI‑функций в Laravel‑приложениях.

Необычное поведение null в PHP

В PHP null иногда выступает не просто как пустое значение, а как специальный аргумент, меняющий поведение встроенной функции. Статья разбирает такие случаи в array_map, array_filter, array_column, array_slice, error_reporting и set_error_handler, а также рассматривает предложение разрешить null в usort().

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

Настройка SSH аутентификации на Linux

Подробное руководство по настройке аутентификации по SSH-ключам на Linux-сервере. В статье разобраны генерация ключей, копирование на сервер, проверка подключения и отключение входа по паролю с примерами консольных команд.