2010年8月30日星期一

正確應付ASP.NET 4.0的Request Validation

這個錯誤,我幾乎肯定每一個寫ASP.NET的人都會遇過 :
從客戶端(xxx)中檢測到有潛在危險的Request.Form 值。 說明: 請求驗証過程檢測到有潛在危險的客戶端輸入值,對請求的處理已經中止。...

若上網搜尋解決方法,有半數的答案都是叫你在Page Detective把validateRequest設成"false",Ajax CallBack的話可能會叫你在web.config加入<httpRuntime requestValidationMode="2.0" />就了事。

ASP.NET 4.0的Request Validation由以往2.0時的*.aspx層面擴大至web service (*.asmx)和http handler(*.ashx)層面 (請參考ASP.NET 4 Breaking Changes)。其實既然MS提供全面的防止跨網站(XSS)指令碼攻擊,我們何必把它關掉,如果你想你的網站安全,就必須在Client-Side和Server-Side下功夫。

在設計ASP.NET頁期間,大家都會知道如Button Control都會有OnClick和OnClientClick事件,但如果用上jQueryUI這類純HTML Element的話,大家自然會加上runat="Server",然後掛上Event Handler (如btnSave_OnClick),例如jQueryUI的Button:
<button id="btnSave" runat="server" type="button" OnServerClick="btnSave_Click">
<span>Save</span>
</button>
大家都明白 :
上述Button中的OnServerClick等於ASP.NET原生的Button Control的OnClick ;同樣地OnClick亦等於OnClientClick。

兩者可以並存,而且亦因為會先觸發OnClick的事件,之後再觸發OnServerClick,所以要避免出現Request Validation的錯誤,正確做法就是Post Form前,先用JavaScript把String做一HTML Encode,然後再Post至Server,才是正確的做法。

JavaScript的HTML Encode和Decode,簡單的可以用Replace方法,但我就使用PHPJS的方法,PHPJS中有兩個方法, htmlentities() 和 html_entity_decode(),就是給你做Encode和Decode之用。

假設我有一個TextBox叫txtTitle,一個Button叫btnSave的話,那實際做法就是:
<script type="text/javascript">
$(document).ready(function () {
HtmlDecode();
});

function HtmlEncode() {
html = $('#txtTitle').val();
$('#txtTitle').val(htmlentities(html));

}
function HtmlDecode() {
s = $('#txtTitle').val();
$('#txtTitle').val(html_entity_decode(s));

}
</script>
<asp:TextBox ID="txtTitle" runat="server" MaxLength="100" Width="400" ClientIDMode="Static"></asp:TextBox>
<button id="btnSave" clientidmode="Static" runat="server" type="button" onclick="HtmlEncode();" onserverclick="btnSave_Click">
<span>Save</span>
</button>
這就會在PostBack前,先把txtTitle.Text做一次Encode,那就可以避免出現問題。

上述的程序其實已經做了Encode,所以Server那邊是否需要再做一次HttpUtility.HtmlEncode()呢,我就覺得看你是否對PHPJS或你自定義的方法是否信任,我就安全為上,寫入Database時都會再做一次HttpUtility.HtmlEncode()。

2010年8月29日星期日

推薦使用SMPlayer播放RMVB

K-Lite Codec Mega Pack由6.2.0之後不再連帶任何商業的Codec,Divx和Real Codec日後都不再包含在內,所以我都很苦惱有什麼代替品,雖然安裝Real Alternative都是一樣,但始終對我這類有電腦潔癖的人,就是不太願意安裝太多有FootPrint的軟件。

不知為什麼大陸的日劇組總是喜歡轉做RMVB格式發佈,其實今時今日RMVB已經再沒有優勢,在個個都用寬頻上網和BT的環境下,根本300MB和1000MB其實分別已經不大。

我找遍Google都再找不到Codec Pack有Real Codec而且還有更新,例如PureCodec已經半死狀態。
所以我試一試VLC Player看看播RMVB效果如何,其實我都不是第一次用VLC,老實說,我對它的界面感覺很差,設定又很複雜。
在PortableApps下載後,試試播RMVB,感覺好似有點一格格的Lag,Seeking又Lag,畫面好似怪怪地,好似比常淡色和較光,不到3分鐘我就刪除,我懶得去做調整。

之後再試MPlayer的變種SMPlayer,同樣是使用Portable版,下載之後,試播,效果很好。
完全沒有VLC的問題,但和我使用的舊版K-Lite比較之下,還是K-Lite比較好,主要是當我1680x1050 Full Screen時,K-Lite的起格情況沒有那麼嚴重,不過在沒有選擇情況下,我只好用SMPlayer做臨時方案。

20100828_202332-t.png

2010年8月18日星期三

VirtualBox安裝Mac OS X Snow Leopard

VirtualBox 3.2開始支援MacOSX,好奇心驅使下,安裝來玩玩。

我的電腦配備如下:
  • Intel Core 2 Duo E8400 (No OverClock)
  • Foxconn P35A-S P35+ICH10R Chipset
  • 6GB Ram shared 2GB給VirtualBox
  • Geforce 9600GSO
  • Host OS : Windows 7 64bits
  • Guest OS : Mac OS X Snow Leopard 1.3.6 Retail

過程就依照這個連結做:
http://henrynote.twbbs.org/27
唯一分別是這一步,若我跟著文中所做就會停在Console畫面:
1. 把光碟機的光碟釋放
2. 開機順序讓"硬碟"當第一個
3. 將"啟用EFI(僅特殊作業系統)"打勾

我解決方法是用回empireEFIv1085.iso,掛在CDROM做Boot機碟,取消使用VirtualBox的EFI。
但不知是否因為沒有使用回VirtualBox的EFI,所以我更改不到解析度,但我沒有研究下去,始終都只是用來玩玩而已。

還有些Blog文可以參考一下:
How to install Mac OS X Snow Leopard in VirtualBox (Windows or Linux host)
How to Install Mac Snow Leopard on VirtualBox 3.2 with Non Apple, Intel PC
Install Mac OS X Snow Leopard On Windows Using VirtualBox

其實實際使用上,不如外間說那裡慢,一般使用都覺得很順暢,當然你不可能用來行PhotoShop吧,上Youtube會有點Lag,但純粹想感受一下Mac OS的話,是不會令你失望的。

順手做了一個ScreenCast 給大家看看:

2010年8月14日星期六

使用ASP.NET+jQueryUI模擬WordPress的drag&drop widgets

有用過WordPress的網友都會知道WP可以靠Drop&Drop去修改網頁上的Widget位置,這做法有利於可以即時顯示排列結果。

既然是Client-Side的技巧,在ASP.NET上,當然可以做到。
有很多JS Framework都有提供UI Subset去給你直接使用,但我則還是使用jQueryUI去自建,因為明白整個Life cycle,由init到complete,我覺得是很重要的。

jQueryUI方面,你需要用上 Draggable + Droppable + Sortable。

ASP.NET方面,當儲存後,下次再進入時,當然要還原之前所設定的,這時候你就需要使用BulletedList Control,因為BulletedList其實就是<ol>或<ul>。

先給大家看看效果,其實暫時未盡完美,因為應該當Drop完成的時候,所複製的<li>element已經要有[Edit]/[Delete] buttons,但大家見到我暫時還需要PostBack才正常顯示是因為未完成。