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

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

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

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

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

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

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

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

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

Вышла версия OpenVPN 2.7 с поддержкой модуля DCO для Linux-ядра и mbedTLS 4

OpenVPN 2.7 вышла с поддержкой ускоренного модуля DCO для Linux-ядра, улучшенной серверной архитектурой, обновлённой работой с DNS и расширенной поддержкой TLS через mbedTLS 4.

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

Логирование активности пользователей в Laravel с Activity Log v5

Обзор обновлений пакета spatie/laravel-activitylog v5 для Laravel. Рассматриваются новый трейт, буферизация логов, API для указания инициатора действий и изменения структуры хранения данных.

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

Laravel 13.4.0: строгий режим FormRequest и инспекция очередей

Обновление Laravel 13.4.0 добавляет строгий режим для FormRequest, улучшения работы с очередями и поддержку атрибута Delay. Также включены исправления валидации и обновления Carbon.