我是.Net框架中的WPF新手(不用了).我正在编写一个应用程序,通过简单地将.xaml(当前是一个Page元素)文件加载到一个框架中然后根据需要通过名称映射控件,可以非常自定义界面.我们的想法是建立一个人们,他们有兴趣制作皮肤,然后按照他们想要的方式涂抹我的应用程序(很像Winamp).
现在问题出现了,由于我缺乏Xaml知识,是否有可能创建恶意的Xaml页面,在下载和使用时可能有其他嵌入式Iframe或其他可能嵌入html或调用带有恶意内容的远程网页的元素?我相信情况可能如此.
如果是这种情况那么我有两个选择; 要么我有一个自动化过程,可以通过在允许下载之前检查它的元素来删除这些类型的Xaml文件(我认为这将是最困难的),或者在下载之前对它们进行人工审核.有没有我不知道的替代方案可以使整个过程变得更容易?
如果您只是加载 XAML 而没有采取任何预防措施,则会出现两个潜在问题:
解决方案有两个:
限制可以实例化的类
幸运的是,类型可以出现的位置有限:元素名称、附加属性名称、标记扩展、“Type”类型的属性。通过禁止除标准类型扩展之外的任何扩展,扫描所有用法并构建 XAML 中引用的类型的完整列表非常简单。这可以根据已知安全类型的白名单进行检查。任何不在安全列表中引用的类型都会导致 XAML 被拒绝。
注意:内置 XamlReader 不允许您提供自定义 IXamlTypeResolver。我使用我编写的增强型 XamlReader,它允许自定义 IXamlTypeResolver,因此我实际上可以在加载时和运行时检测 XAML 中引用的每种类型,而无需进行任何解析:只是无法解析不在白名单。
限制 Uri 属性的设置
XAML 的严格结构再次为我们提供了帮助。可以轻松扫描它以确定将调用的每个属性设置器以及要设置的值或绑定(不要忘记样式和附加属性)。如果使用除包 Uri 之外的任何绝对 Uri,则 XAML 可能会被拒绝。尝试使用标记扩展设置 Uri 也会被类似地拒绝。