2012-02-22 48 views
4

做控件,這是默認的ASP.Net控件集的一部分 - 所有的時間都使用viewstate或controlstate?ASP.Net控件是否通過viewstate公開SQL查詢?

即如果我將下面的代碼放到一個全新的Web表單上,我的SQL字符串是否放置在未加密的控制狀態中?

<asp:SqlDataSource ID="mobileData" runat="server" 
     DataSourceMode="DataReader" 
     SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL" 
/> 

我知道如何視圖狀態和加密了ControlState-,但似乎瘋了,我認爲這種常見的情況可能是這樣的窘況不安全。當然可以通過修改控制狀態來執行SQL注入攻擊?我認爲大多數人都會考慮爲敏感應用程序加密控制狀態,但實際上,如果我的假設是真實的 - 那麼它應該總是完成 - 並且Visual Studio默認啓用它?

我是否正確思考這個問題,還是我的棍棒有錯誤的結局?

+1

您可能需要查看:http://programmers.stackexchange.com/questions/115374/using-sqldatasource-databound-controls-in-asp-net-bad-practice – NotMe 2012-02-22 19:00:27

+0

爲什麼會串進入的ViewState或ControlState?它是靜態的。 – 2012-02-22 19:09:46

回答

1

回答你的問題,沒有
MSDN

爲了安全起見,SelectCommand屬性不存儲的視圖狀態。因爲有可能在客戶端上解碼視圖 狀態的內容,所以在視圖狀態下存儲關於數據庫結構的敏感信息可能導致信息泄露漏洞。

+0

非常感謝您爲我清理這個:-) – RobD 2012-02-23 08:30:27

+0

@RobD - 我的快樂伴侶。 – 2012-02-23 15:32:49

1

此信息永遠不會存儲在ViewState中。

並非所有屬性都像這樣

public string SomeProperty 
     { 
      get 
      { 
       object obj = ViewState["SomeProperty"]; 
       return (obj == null) ? 0 : (string)obj; 
      } 
      set 
      { 
       ViewState["SomeProperty"] = value; 
      } 
     } 

的SelectCommand這裏是在生成的C#/ VB類由PageParser分配創建。該類將包含一些行,如

mobileData.SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL" 

並且每次請求頁面時都會執行此分配。 ASP.net不需要將它保存在ViewState中。


但是,如果你這樣做

<asp:HiddenField runat="server" Value="SELECT * from ma.bob WHERE Vendor IS NOT NULL" /> 

這將走的ViewState(我說過解析器是真的在這裏還可以,但二傳手在這裏實現了ViewState的機制)

+2

你有權威來源聲明這一點嗎? – Oded 2012-02-22 18:48:22

+2

@Oded - http://stackoverflow.com/a/9401030/422219 – zeroef 2012-02-22 18:52:45