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