相依性屬性的安全性

相依性屬性通常應該視為公用屬性。 Windows Presentation Foundation (WPF) 屬性系統的本質可防止安全性保證相依性屬性值。

包裝函式和相依性屬性的存取和安全性

一般而言,相依性屬性會與「包裝函式」Common Language Runtime (CLR) 屬性一起實作,以簡化從實例取得或設定屬性。 但是包裝函式確實只是實作與相依性屬性互動時所使用的基礎 GetValueSetValue 靜態呼叫的便利方法。 以另一種方式思考,屬性會公開為 Common Language Runtime (CLR) 屬性,這些屬性會以相依性屬性而非私人欄位支援。 套用到包裝函式的安全性機制,與屬性系統行為和基礎相依性屬性的存取並不相同。 將安全性需求放在包裝函式上只會防止使用便利方法,但不會防止呼叫 GetValueSetValue 。 同樣地,對包裝函式設置保護或私用存取層級並不會提供任何有效的安全性防護。

如果您要撰寫自己的相依性屬性,您應該將包裝函式和 DependencyProperty 識別碼欄位宣告為公用成員,讓呼叫端不會取得該屬性之真實存取層級的誤導資訊(因為它的存放區實作為相依性屬性)。

針對自訂相依性屬性,您可以將屬性註冊為唯讀相依性屬性,這確實提供了防止任何不保存該屬性參考 DependencyPropertyKey 之 任何人設定屬性的有效方法。 如需詳細資訊,請參閱唯讀相依性屬性

注意

DependencyProperty不禁止宣告識別碼欄位私用,而且可想而知,它可以用來協助減少自訂類別的立即公開命名空間,但基於下一節中所述的原因,不應該將這類屬性視為「私用」。

相依性屬性的屬性系統公開

通常並不實用,而且可能會產生誤導性,將 宣告 DependencyProperty 為公用以外的任何存取層級。 該存取層級設定只能防止使用者取得宣告類別執行個體的參考。 但是,屬性系統有幾個層面會傳回 DependencyProperty 作為識別特定屬性的方法,因為它存在於類別實例或衍生類別實例上,而且即使原始靜態識別碼宣告為非公用,這個識別碼仍可在呼叫中使用 SetValue 。 此外, OnPropertyChanged 虛擬方法也會接收任何變更值之現有相依性屬性的資訊。 此外,方法會 GetLocalValueEnumerator 傳回實例上具有本機設定值之任何屬性的識別碼。

驗證和安全性

將要求套用至 ValidateValueCallback ,並預期在需求失敗時發生驗證失敗,以防止設定屬性不是適當的安全性機制。 如果呼叫端是在應用程式域內運作,透過 強制執行 ValidateValueCallback 的 Set-value invalidation 也可能由惡意呼叫端隱藏。

另請參閱