hit counter for blogger

黑暗執行緒

 黑暗執行緒搬新家囉!! http://www.darkthread.net

11/16/2006

KB-ASP.NET 2.0 TextBox.ReadOnly之行為改變

今天接獲回報,先前寫的控件(繼承自TextBox的數字輸入欄位WebControl)在ASP.NET 2.0下有問題,當控件ReadOnly設為True時,在前端用Javascript修改控件<INPUT>的Value,用Fiddler看,新值明明PostBack回後端了,但是在Server-Side查到的是前端修改前的舊值。

有點懷疑這是ASP.NET 2.0的Behavior改變,用TextBox測試,果然如此!

我的測試是先在Server-Side設定TextBox1屬性
TextBox1.Text=”OldValue”;
TextBox1.ReadOnly=true;

接著前端用document.all(“TextBox1”).value=”NewValue”;改變數值,PostBack後,Server-Side用TextBox1.Text取得的是”OldValue”,同樣的程式在1.1上執行結果為”NewValue”。

Google了一下,印證了這是ASP.NET 2.0的改變,主要是為了安全的考量,因為這樣可以防止前端利用Javascript或其他技巧去篡改已設為ReadOnly的欄位,提高安全性。不過呢,過去有不少專案將加總值等等設成ReadOnly,由JavaScript計算填入再傳入後端。我想若以最高安全標準來看,應該要在後端再重算一次,以免將有心人篡改過的數字寫入資料庫。只是同樣的邏輯要寫兩次(還一次用Javascript、一次用C#/VB.NET),成本有點高。若該欄位存的是連狗都沒興趣的數字,則便宜行事是可以被接受的(又不是在報特支費發票),如果你想要找回從前"前端對User設唯讀,但JavaScript修改值可以傳回"的模式,可以試試以下兩種做法:
1.用Request["TextBox1"]的方式取值
2.TextBox1.Attributes.Add("ReadOnly","ReadOnly");

雖然還是有解決方案,但比較煩的是,過去的一些ASP.NET 1.1專案,不少的TextBox.ReadOnly只用來擋使用者輸入,還是接受由JavaScript自動算值後填入;專案轉到2.0,表面上順利無誤,執行的結果可不太妙,全部掃一次Code的功夫看來是少不了,要做1.1->2.0移轉的朋友們要特別留意。

2 Comments:

  • 觉得你的自我介绍很有意思!
    我也不是电脑专业,严格说我本来也不是个会读书的人,但命运的安排,现在竟然成为一个在英读研的老骨头,有趣有趣!

    By Blogger kingdavid2000, at 1/15/2008 2:55 am  

  • to david, 幸會了! 在網路上可以來自四面八方的朋友,是件新奇而有趣的事兒。我的Blog搬到http://www.darkthread.net去了,有空多來逛逛哦。

    By Blogger Darkthread, at 1/15/2008 8:09 am  

Post a Comment

<< Home