Если цель состоит в том, чтобы предотвратить манипулирование «статическими» 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 вся эта работа выполняется в фильтре, как я это сделал. Задний конец изолирован от этого.
Если вы хотите, вы можете сделать серверную часть полностью изолированной от этого с помощью исходящего фильтра, который обрабатывает шифрование/подпись URL-адреса на выходе.
Это также то, что я сделал.
Недостатком является то, что это очень сложно сделать правильно и эффективно. Вам нужен легкий синтаксический анализатор HTML для извлечения URL-адресов (я написал потоковый синтаксический анализатор, чтобы делать это на лету, чтобы он не копировал всю страницу в ОЗУ).
Яркая сторона заключается в том, что вся содержательная сторона «просто работает», поскольку они ничего об этом не знают.
Также существует некоторая особая обработка при работе с Javascript (поскольку ваш фильтр не будет легко «знать», где находится URL-адрес для шифрования). Я решил эту проблему, потребовав, чтобы URL-адреса были подписаны так, чтобы они были конкретными «var signedURL='....'», поэтому я могу легко найти их в выводе. Не такое уж бремя для дизайнеров, как вы могли бы подумать.
Другая яркая сторона фильтра заключается в том, что вы можете отключить его. Если у вас происходит какое-то «странное поведение», просто выключите его. Если поведение продолжается, вы обнаружили ошибку, связанную с шифрованием. Это также позволяет разработчикам работать с открытым текстом и оставлять шифрование для интеграционного тестирования.
Больно делать, но в целом приятно.
person
Will Hartung
schedule
25.10.2010