2013-08-05 50 views
1

我有一個新的開發人員正在使用一種接口變量創建模型來「保護」其他變量。代碼有點看起來是這樣的:ASP.NET模型保護

public class stuff 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public int thingType { get; set; } 
} 
public class people 
{ 
    public int id { get; set; } 
    public sting name { get; set; } 
    private IEnumerable<stuff> ourThings; 
    public IEnumerable<stuff> things { get {return ourThings; } } 
} 

我認爲,如果我不想冒險的人修改模型,我會讓我的設置方法爲私有的變量。我也不知道這是如何影響我的網站的攻擊。有沒有人見過或聽說過這個?如果是這樣,你能解釋一下真正的目的和我想保護什麼嗎?

再次感謝!

+0

我假設他們正在使用IEnumerable 作爲一種防止某人直接在集合上調用.Add(Stuff)的方法。 –

回答

3

那麼整體問題,這整個事情:

private IEnumerable<stuff> ourThings; 
public IEnumerable<stuff> things { get {return ourThings; } } 

是集合仍然可以修改。您不需要set修改集合,因爲它是一個引用類型。但是,如果你想讓它一成不變的設計,你可以做這樣的事情:

private IEnumerable<stuff> ourThings; 
public IEnumerable<stuff> things { get {return ourThings.ToList(); } } 

,因爲這將建立原始集合的副本。無論如何,這是一種方式,而且它證明是非常成功的。

+0

感謝您的快速響應。 我仍然不完全明白這是試圖保護什麼。正在編寫的應用程序非常小。我並不擔心另一位開發人員意外添加修改和保存不應該是的模型。實際上,如果他們將一件物品添加到收藏中然後保存,我會認爲這是故意的。 – DR913

+0

@ DR913,這完全取決於你從設計的角度來看你想要什麼,但是其他開發者寫了什麼*保護*集合,但沒有。如果你想讓用戶能夠添加到集合中,只需設置'public IEnumerable things {get;私人設置; }'並在'ctor'中創建一個'new'像這樣'this.things = new List ();' –

0

公共,內部和私有訪問修飾符用於在您的應用程序體系結構上強制實施約束,但它們並不旨在防禦攻擊。

我建議你尋求關於如何保護web應用程序的指導。這個主題有很多可用的材料。