Скрытые поля не всегда являются проблемой, но они всегда должны звонить в сигналы тревоги, поскольку у них есть две потенциальные проблемы:
1) Если данные являются конфиденциальными, они открываются для клиента (например, с использованием прокси или просто просматривают источник - и пытаться предотвратить это программно бессмысленно)
2) Если данные интерпретируются сервером, опытный пользователь может их изменить. Например, если в скрытом поле содержится остаток на счете пользователя, он может использовать прокси-сервер или некоторый нестандартный клиент, чтобы заставить сервер думать, что остаток на его счету - это все, что он выберет.
Второй - большой источник уязвимостей в веб-приложениях. Данные, связанные с сеансом, должны храниться на стороне сервера, если только у вас нет возможности проверить их на сервере (например, если поле подписано или зашифровано сервером).
Если вы уверены, что не попадете ни в одну из этих ловушек, их можно использовать. Как правило, я бы не использовал скрытые поля, за исключением данных, которые вы были бы рады видеть в строке запроса, или если бы JavaScript требовался для их обработки. В последнем случае вам все же нужно убедиться, что сервер проверяет, хотя не думайте, что клиент запустит ваш javascript.