Очистить ввод для BinaryFormatter

Я использую .NET BinaryFormatter вместе с Convert.ToBase64String для сериализации настраиваемого объекта и сохранения его в скрытом теге <input> на веб-странице.

Когда пользователь отправляет форму, я отменяю шаги для десериализации настраиваемого объекта:

var formatter = new BinaryFormatter();
var byteData = Convert.FromBase64String(submittedString);
var ms = new MemoryStream(byteData);
var originalObject = (MyCustomType)formatter.Deserialize(ms);

Зияющая дыра в безопасности: что, если пользователь умело сериализует экземпляр MyMaliciousType и преобразует его в строку base-64, а затем отправляет это в веб-форму.

Есть ли способ узнать, соответствует ли десериализуемый тип заданному типу до фактического выполнения десериализации?


person Ryan    schedule 12.11.2012    source источник


Ответы (1)


Если у вас есть надлежащая обработка исключений, приведение к вашему типу не удастся - и никакого вреда не будет.

Если вам нужен больший контроль над сериализацией ваших данных и вы хотите следить за тем, что происходит в процессе десериализации, вам в конечном итоге потребуется реализовать какой-то собственный классификатор объектов.

Может быть, даже простой формат XML, чтобы вы могли просто перебирать узлы, и если что-то не выглядит так, как должно, просто выбросьте его.

Хотя, если хотите разобраться сами:

Вот официальная спецификация BinaryFormatter: http://msdn.microsoft.com/en-us/library/cc236844(prot.20).aspx
А также, вот меньшая, сторонняя спецификация для него: http://primates.ximian.com/~lluis/dist/binary_serialization_format.htm

Используя эти ресурсы, вы сможете заглянуть в двоичный поток и увидеть тип сериализованного контента. Однако это кажется совершенно ненужным.

Просто проведите тщательную проверку данных после десериализации.

person caesay    schedule 12.11.2012