2012-03-27 24 views
1

例如,假設我有一個包含重要控件的gridview列,有一個隱形的ASP.NET控件安全嗎?

如果我使它們在普通用戶中不可見並且對管理員用戶可見,是否安全?

If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser") 
{ 
    gridview1.columns[0].visible = true; 
} 
+2

有一種方法來檢查。看看發出的HTML,看看有沒有什麼。如果有內容只是樣式不顯示,那麼它可供所有人查看。如果沒有呈現內容,則隱身措施本身會阻止用戶看到它。 (在後一種情況下,我毫不猶豫地說「安全」,因爲在這個問題的範圍之外可能有其他任何因素使得整個系統不安全。) – David 2012-03-27 18:09:09

回答

5

即使將可見性設置爲false,控件也存儲在Viewstate中。視圖狀態沒有加密,只是Base-64編碼。理論上,it is possible to parse the viewstate and extract values,所以它不是100%安全的,但是大多數人很難利用這些弱點並提取值。

對於次要的事情,這樣做可能是可以的,但是如果你保護了真正敏感的數據,我會找到另一種隱藏數據的方法,或者根本沒有把它放到客戶端。對於一個控件,可能會將其添加到管理用戶的代碼隱藏中,而不是將其設置爲false。

當然,練習縱深防禦。

簡單地隱藏控件就是所謂的「默默無聞的安全性」,它根本沒有什麼安全性。它是一個有效的附加安全層,但是您絕對不應該依賴它(例如,如果您不知道URL,則隱藏指向敏感信息的鏈接,假設您無法訪問它)。如果您確實使用它來隱藏鏈接,您仍然需要像保護鏈接不「隱藏」一樣小心保護這些頁面。攻擊者找到這種「隱藏」的鏈接有很多種方法。

+0

Viewstate上的良好通話,我已經忘記了這一點。 (很高興知道我沒有看到它足夠長,以至於我能夠忘記它。)這是一個很好的理由,以我平常的建議爲不同的用戶環境提供不同的頁面。用戶控件和其他可重用元素可以在這些頁面上動態組合,但我喜歡將授權作爲資源級別(頁面,操作等)關注。 – David 2012-03-27 18:13:18

1

除了@David的答案。您可以在RowBoundData事件中對此列進行格式設置。

如果是非管理員用戶,請勿將文本設置爲此控件。

protected void grd_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     Label SecuredColumn = (Label)e.Row.FindControl("SecuredColumn"); 
     if (Request.ServerVariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser") 
     { 
      SecuredColumn.Text = ((YourClass)e.Row.DataItem).YourPropertyName; 
      SecuredColumn.Visible = true; 
     } 
     else 
     { 
      SecuredColumn.Visible = false; 
     } 
    } 
}