Если целью является предотвращение манипулирования «статическими» URL-адресами, то вы можете просто зашифровать параметры или подписать их. Скорее всего, «достаточно безопасно» использовать MD5 для параметров URL вместе с солью. Соль может быть случайной строкой, хранящейся в сеансе, скажем.
Тогда вы можете просто:
http://example.com/service?x=123&y=Bob&sig=ABCD1324
Этот метод предоставляет данные (т. Е. Они могут "видеть", что xyz = 123), но не могут изменять данные.
Есть преимущество «шифрования» (и я использую этот термин свободно). Здесь вы шифруете весь раздел параметров URL.
Здесь вы можете сделать что-то вроде:
http://example.com/service?data=ABC1235ABC
Преимущество использования шифрования в два раза.
Один из них защищает данные (например, пользователь никогда не увидит, что xyz = 123).
Другая особенность заключается в том, что он расширяемый:
http://example.com/service?data=ABC1235ABC&newparm=123&otherparm=abc
Здесь вы можете декодировать исходную полезную нагрузку и выполнить (безопасное) слияние с новыми данными.
Таким образом, запросы могут добавлять данные в запрос, но не изменять СУЩЕСТВУЮЩИЕ данные.
Вы можете сделать то же самое с помощью техники подписывания, вам просто нужно объединить весь запрос в один «блоб», и этот блоб неявно подписан. Это «эффективно» зашифровано, просто слабое шифрование.
Очевидно, вы не хотите делать это на клиенте. Нет никакого смысла. Если вы можете сделать это, «они» могут сделать это, и вы не можете заметить разницу, поэтому вы также можете вообще не делать этого - если только вы не хотите «шифровать» данные через обычный порт HTTP (против TLS, но тогда люди будут мудро удивляться "зачем это надо").
Для Java вся эта работа идет в Filter, вот как я это сделал. Задняя часть изолирована от этого.
Если вы хотите, вы можете сделать внутреннюю часть полностью изолированной от этого с помощью исходящего фильтра, который обрабатывает шифрование / подпись URL при выходе.
Я тоже так и сделал.
Недостатком является то, что это очень важно, чтобы сделать это правильно и производительно. Вам нужен облегченный HTML-анализатор для извлечения URL-адресов (я написал потоковый анализатор, чтобы сделать это на лету, чтобы он не копировал всю страницу в ОЗУ).
Яркой стороной является то, что вся сторона контента «просто работает», поскольку они ничего об этом не знают.
Существует также особая обработка при работе с Javascript (поскольку ваш фильтр не может легко «знать», где находится URL для шифрования). Я решил эту проблему, потребовав, чтобы URL-адреса были подписаны так, чтобы они были специфическими "var signatureURL = '....'", чтобы их было легко найти в выходных данных. Не так тяжело для дизайнеров, как вы думаете.
Другой яркой стороной фильтра является то, что вы можете отключить его. Если происходит какое-то «странное поведение», просто выключите его. Если поведение продолжается, вы обнаружили ошибку, связанную с шифрованием. Это также позволило разработчикам работать в открытом тексте и оставить шифрование для тестирования интеграции.
Больно делать, но в целом приятно.