Если вы просто загружаете XAML без каких-либо мер предосторожности, это может стать причиной двух возможных проблем:
- XAML может вызывать методы ваших объектов, используя «x: Static» и «ObjectDataSource»
- XAML может включать HTML и изображения из произвольного Uris, поэтому, если в коде HTML-обработки или обработки изображения есть ошибка, вредоносная программа может использовать его
Решение имеет два аспекта:
- Ограничить классы, которые могут быть созданы.
- Ограничить настройку свойств Uri только относительными источниками.
Ограничение классов, которые могут быть созданы
К счастью, количество типов мест может быть ограниченным: имена элементов, имена прикрепленных свойств, расширения разметки, свойства типа «Тип». Запрещая любые, кроме стандартных расширений типов, довольно просто сканировать все случаи использования и создать полный список типов, на которые есть ссылки в XAML. Это можно проверить по белому списку известных безопасных типов. Любые типы ссылок, которых нет в безопасном списке, приводят к отклонению XAML.
Примечание. Встроенный XamlReader не позволяет вам предоставлять пользовательский IXamlTypeResolver. Я использую улучшенный XamlReader, который я написал, который позволяет использовать пользовательский IXamlTypeResolver, так что я могу фактически обнаружить каждый тип, на который есть ссылка в XAML, во время загрузки и во время выполнения без какого-либо анализа: просто не удается разрешить любой тип типа, не находящийся на Белый список.
Ограничение настройки свойств Uri
Опять жесткая структура XAML приходит к нам на помощь. Его можно легко отсканировать, чтобы определить каждый установщик свойств, который будет вызываться, и значение или привязку, которые нужно установить (не забывайте стили и вложенные свойства). XAML может быть отклонен, если используется любой абсолютный Uri, кроме Uri пакета. Попытки установить Uri с использованием расширения разметки будут отклонены аналогичным образом.