2010-04-09 119 views
7

我對.Net框架中的WPF非常陌生(弄明白了)。我正在編寫一個應用程序,其中界面是非常可定製的,只需將.xaml(當前是頁面元素)文件加載到框架中,然後根據需要通過名稱映射控件。這個想法是有一個有興趣製作皮膚的人的社區,但是他們想要的皮膚我的應用程序(很像Winamp)。WPF皮膚剝皮安全問題

現在問題出現了,由於缺乏Xaml知識,是否有可能創建惡意的Xaml頁面,當下載和使用該頁面時,可能會有其他嵌入式iframe或其他元素可能嵌入html或將遠程網頁與惡意內容?我相信情況可能如此。

如果是這種情況,那麼我有兩個選擇;要麼我有一個自動化的過程,可以通過在允許下載之前檢查它的元素來刪除這些類型的Xaml文件(我認爲這將是最困難的),或者讓人員在下載之前檢查它們。有沒有我不知道的替代品可以使整個過程變得更容易?

回答

3

如果你簡單地加載XAML沒有考慮有兩個潛在的問題任何預防措施:

  1. 的XAML可以調用使用你的對象的方法「X:靜態」和「ObjectDataSource控件」
  2. 的XAML可以從任意尤里斯合併HTML和圖像,所以如果有在HTML處理或圖像處理代碼中的錯誤,惡意軟件可以利用它

的解決方案是雙重的:

  1. 限制可實例化的類。
  2. 僅將Uri屬性的設置限制爲相對來源。

限制可實例

類幸運的是,只有種可能出現名額有限:元素名稱,附加屬性的名稱,標記擴展,類型爲「類型」的屬性。通過不允許任何標準類型的擴展,掃描所有用法並構建XAML中引用的完整類型列表非常簡單。這可以針對已知安全類型的白名單進行檢查。任何不在安全列表中的引用類型都會導致XAML被拒絕。

注意:內置XamlReader不允許您提供自定義IXamlTypeResolver。我使用了一個我編寫的允許自定義IXamlTypeResolver的增強XamlReader,因此我實際上可以檢測加載時和運行時在XAML中引用的所有類型,而不進行任何解析:只是未能解析任何類型的類型白名單。

限制URI屬性

的設置重新XAML的剛性結構來援助我們。它可以很容易地被掃描,以確定將被調用的每個屬性設置器以及要設置的值或綁定(不要忘記樣式和附加屬性)。如果使用除包Uri之外的任何絕對Uri,則XAML可以被拒絕。嘗試使用標記擴展來設置Uri也會被拒絕。