Вопрос

Я пытаюсь сохранить сериализованный объект XML в файле cookie, но получаю такую ​​ошибку:

A potentially dangerous Request.Cookies value was detected from the client (KundeContextCookie="<?xml version="1.0" ...")

Я знаю проблему по похожим случаям, когда вы пытаетесь сохранить что-то похожее на код JavaScript в поле ввода формы.

Какова здесь лучшая практика?Есть ли способ (например, проблема с формой, которую я описал) подавить это предупреждение из платформы asp.net, или вместо этого мне следует сериализовать JSON или, возможно, мне следует сериализовать его в двоичном формате?Какова обычная практика хранения сериализованных данных в файле cookie?

РЕДАКТИРОВАТЬ:Спасибо за ответ.Причина, по которой я хочу хранить в файле cookie больше данных, чем идентификатор, заключается в том, что получение объекта, который мне действительно нужен, из службы, которую я не могу контролировать, занимает около 2 секунд.Я создал облегченный объект «KundeContext», в котором хранятся некоторые свойства полного объекта, но они используются в 90% случаев.Таким образом, мне нужно будет вызвать медленный сервис только на 10% моих страниц.Если бы я сохранил только идентификатор, мне все равно пришлось бы вызывать службу почти на всех моих страницах.

Я мог бы хранить все строки и целые числа отдельно, но у объекта есть и другие легкие объекты, такие как «контактная информация» и «адрес», которые было бы утомительно сохранять вручную для каждого из их свойств.

Это было полезно?

Решение

Я бы не стал хранить данные в формате XML в файле cookie — для начала существует ограничение на размер файла cookie (раньше было 4 КБ для все заголовки, включая файлы cookie).Вместо этого выберите менее подробную стратегию кодирования, например разделители, например.a|b|c или отдельные значения файлов cookie.Кодирование с разделителями делает декодирование значений особенно простым и быстрым.

Ошибка, которую вы видите, заключается в том, что ASP.NET жалуется, что заголовки выглядят как XSS-атака.

Другие советы

Хранение сериализованных данных в файле cookie — очень и очень плохая идея.Поскольку пользователи имеют полный контроль над данными файлов cookie, им слишком легко использовать этот механизм для передачи вам вредоносных данных.Другими словами: любой слабость вашего кода десериализации мгновенно становится доступной для использования (или, по крайней мере, способом что-то сломать).

Вместо этого сохраняйте в файлах cookie только самый простой идентификатор, формат которого можно легко проверить (например, GUID).Затем сохраните сериализованные данные на стороне сервера (в базе данных, XML-файле в файловой системе или где-то еще) и извлеките их, используя этот идентификатор.

Редактировать:Кроме того, в этом сценарии убедитесь, что ваш идентификатор достаточно случайен, чтобы пользователи не могли угадать идентификаторы друг друга и выдать себя за другого, просто немного изменив свой собственный идентификатор.Опять же, GUID (или идентификаторы сеанса ASP.NET) очень хорошо подходят для этой цели.

Второе редактирование после разъяснения сценария владельцем вопроса:зачем вообще использовать собственные файлы cookie в этом случае?Если вы сохраняете ссылку либо на исходный объект, либо на облегченный объект в состоянии сеанса (объект сеанса), ASP.NET позаботится обо всех деталях реализации за вас весьма эффективным способом.

Посмотрите в Просмотр состояния.Возможно, вы захотите сохранить данные при обратной передаче во ViewState вместо использования файлов cookie.В противном случае вам, вероятно, следует сохранить XML на сервере, а уникальный идентификатор этих данных — в файле cookie.

Вы можете рассмотреть возможность использования Состояние сеанса для сохранения значения.Вы можете настроить его на использование файла cookie для хранения идентификатора сеанса.Это также более безопасно, поскольку значение не видно и не может быть изменено пользователем.

Другая альтернатива — использовать механизм распределенного кэширования для хранения значения.Мой текущий фаворит Мемкеш.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top