Считается ли это хорошей / плохой практикой?
Зависит от цели. До сих пор я видел только такие конструкции как хэш URL-адреса на стороне клиента, чтобы запомнить состояние выборок в больших приложениях на основе ajax (чтобы они были добавлены в закладки), а затем часто также Gzip, чтобы сделать его короче. В вашем конкретном случае я бы сказал: используйте сеанс HTTP и передавайте только идентификатор, основанный на запросе (также называемый токен ), в скрытое поле, чтобы вы могли получить связанную информацию из сеанса.
Есть ли ограничение длины скрытых полей в HTML-форме?
В GET полная строка запроса (все имена параметров и значения и разделители вместе) обычно ограничена 2048 символами, но вы можете лучше придерживаться строгого ограничения в 256 символов. В POST это зависит от конфигурации сервера. Часто это по умолчанию около 2 ГБ.
Каковы возможные проблемы безопасности?
Ну, это, очевидно, возможность декодирования.
И есть ли лучшие альтернативы? (с пояснениями, желательно без использования javascript)
Вы можете сжать его, чтобы сделать его короче и менее заметным. Или, как уже было сказано, используйте сеанс в сочетании с идентификатором на основе запроса.