Валидация строк, содержащих шестнадцатеричные данные, часто
используется при работе с идентификаторами, криптографическими
значениями, цветами и бинарными представлениями. В Joi для этого
предусмотрен специализированный метод hex, который
обеспечивает проверку строки на соответствие шестнадцатеричному
формату.
Метод hex применяется к базовому типу строки и
ограничивает допустимые символы диапазоном 0-9,
a-f, A-F. Любые другие символы автоматически
приводят к ошибке валидации. Это позволяет гарантировать, что данные
строго соответствуют hex-формату без дополнительных проверок.
Типичная структура использования:
import Joi from 'joi';
const schema = Joi.object({
hash: Joi.string().hex()
});
Такой вариант проверяет только допустимость символов, но не
ограничивает длину строки. В реальных сценариях hex-значения почти
всегда имеют фиксированный размер, например 32 символа для MD5 или 64
символа для SHA-256. Для этого применяется комбинирование
hex с ограничениями длины.
const schema = Joi.object({
md5: Joi.string().hex().length(32),
sha256: Joi.string().hex().length(64)
});
Ограничение длины является важным элементом защиты от некорректных или частично обрезанных данных. Joi выполняет проверку последовательно: сначала проверяется набор символов, затем длина строки.
В некоторых случаях требуется контроль не только длины, но и
структуры hex-данных, например при работе с бинарными буферами,
представленными в текстовом виде. В таких ситуациях полезно использовать
дополнительные ограничения, такие как регулярные выражения, однако
hex остаётся более читаемым и декларативным способом
выражения намерения.
const colorSchema = Joi.object({
color: Joi.string().hex().length(6)
});
Такой подход часто применяется для проверки цветов в формате
RRGGBB, где строка не содержит символа `
Работа с data URI представляет собой отдельный класс задач, связанных с передачей бинарных данных в текстовом формате. Data URI используется для встраивания изображений, файлов и других ресурсов непосредственно в строку. Формат описывается стандартом RFC 2397 и имеет вид:
data:[<mediatype>][;base64],<data>
В Joi для проверки таких строк используется метод
dataUri, который обеспечивает базовую валидацию
структуры.
const schema = Joi.object({
file: Joi.string().dataUri()
});
Данный валидатор проверяет, что строка начинается с префикса
data: и соответствует общей структуре data URI. Это
включает наличие MIME-типа (необязательно), указание кодировки
base64 при необходимости и наличие самой полезной нагрузки
после запятой.
Валидация data URI особенно важна в системах, где пользователь может загружать файлы в виде строк, например изображения аватаров или вложения в API-запросах. Без проверки структура может быть нарушена, что приведёт к ошибкам декодирования или потенциальным уязвимостям.
Пример более прикладного использования:
const imageSchema = Joi.object({
avatar: Joi.string().dataUri()
});
При необходимости можно комбинировать dataUri с другими
ограничениями строки, например проверкой максимального размера, чтобы
ограничить объём передаваемых данных:
const schema = Joi.object({
avatar: Joi.string().dataUri().max(50_000)
});
Такое ограничение не анализирует содержимое data URI, но предотвращает чрезмерно большие строки, которые могут негативно повлиять на производительность или привести к злоупотреблениям.
Внутренняя логика проверки data URI в Joi ориентирована на структурную целостность строки. Основное внимание уделяется корректности схемы и наличию разделителей. При этом содержимое после base64-заголовка не декодируется и не анализируется на соответствие MIME-типу, если не используются дополнительные пользовательские проверки.
Hex и dataUri часто применяются в разных слоях одной системы. Hex-значения характерны для идентификаторов и хэшей, dataUri — для передачи медиа-контента. Их совместное использование встречается в API, где идентификаторы связываются с встроенными ресурсами.
Пример комбинированной схемы:
const schema = Joi.object({
id: Joi.string().hex().length(24),
preview: Joi.string().dataUri()
});
Такое разделение позволяет чётко отделять структурные идентификаторы от бинарных данных, представленных в строковом виде.
При проектировании схем важно учитывать, что hex
проверяет исключительно допустимые символы, не накладывая семантических
ограничений на значение строки. Это означает, что строка может быть
валидной с точки зрения формата, но не соответствовать ожидаемой
бизнес-логике, если не заданы дополнительные правила.
Аналогично dataUri гарантирует корректность синтаксиса,
но не проверяет содержимое на предмет безопасности, типа файла или
корректности декодирования в конкретном контексте приложения. Валидация
на уровне Joi решает задачу структурной проверки, оставляя семантическую
обработку прикладному коду.
При работе с hex-значениями в некоторых системах дополнительно учитывается регистр символов. Joi по умолчанию допускает как верхний, так и нижний регистр, что соответствует стандартной практике представления шестнадцатеричных данных.
Использование строгих ограничений длины вместе с hex
часто заменяет необходимость сложных регулярных выражений, делая схемы
более читаемыми и поддерживаемыми.
const tokenSchema = Joi.object({
accessToken: Joi.string().hex().length(40),
refreshToken: Joi.string().hex().length(64)
});
Такой подход особенно распространён в системах аутентификации, где токены имеют фиксированную длину и кодируются в hex для удобства передачи.
Data URI валидация также часто используется в сценариях клиент-серверного взаимодействия, где изображения или файлы передаются без отдельного загрузочного механизма. В таких случаях Joi обеспечивает первичную фильтрацию входных данных до их дальнейшей обработки.
const uploadSchema = Joi.object({
filename: Joi.string().min(1).max(255),
content: Joi.string().dataUri()
});
Такое разделение позволяет отделить метаданные файла от его содержимого и упростить последующую обработку.
Hex и dataUri остаются базовыми, но важными инструментами в наборе строковой валидации Joi, обеспечивая контроль над распространёнными форматами представления данных в современных веб-приложениях.