贊助商連結

七月 01, 2006

保護Web.config 裡的機密資料

| 原始連結

ASP.NET 下的Web.config 提供了很方便的系統參數設定方式,但是太方便的東西有時後卻得為它另外做一些額外的工作來處理,比如說你可能會在Web.config裡儲存資料庫的連線字串同時又把帳號密碼寫了進去,雖然一般人並不能直接在瀏覽器上輸入網址來偷取Web.confg檔但是心裡總是毛毛的,而且在大部份機構的IT部門都會有一條這樣的規定。

「所有帳號密碼及老闆的情婦身份資料都不能以明碼方式儲存」

所以你想要讓他們掏錢買你做的系統就得要有辦法加密Web.config裡的資料,否則要是大老闆被捉姦在床絕對會認為是你出賣他。

ASP.NET 2.0中有兩個Provider可以幫助你完成保護資料的需求。
他們分別是:

  • RsaProtectedConfigurationProvider
  • DataProtectionConfigurationProvider
現在就讓我們來看看到底要用什麼方法來加解密資料。




使用aspnet_regiis.exe加解密

aspnet_regiis.exe是一個強大的IIS管理工具,如果你已經安裝好.Net framework 2.0的話,他就在 %windir% \Microsoft.Net\Framework\v2.0.50727目錄下,直接在命令提示字元視窗輸入下面指令。

connectionStrings代表你要加密的區段,本文以connectionStrings為範例你也可以視情況加密appSettings等其它區段資料。
applicationName代表你的Web應用程式的虛擬目錄名稱。

下完指令回去看看Web.config是否有些變化,順利的話connectionStrings區段應該會看起來像是這個樣子。

太好了,真是亂成一團!另外要解密還原原來的字串也非常簡單,只需要下面的指令。

如果你夠聰明的話應該會發現他跟加密時的指令只差在-pd的參數而已,如果想知道aspnet_regiis的詳細使用說明請輸入aspnet_regiis /? 或是到MSDN上去翻一翻吧。

「等等,我不能叫使用者去下什麼狗屁指令啊,他除了打電話來煩我之外什麼都不會做。」
嗯,雖然aspnet_regiis非常好用但是使用者就是不會用,所以我們還是得弄出更簡的方法讓使用者可以自己玩才行。




使用程式碼加解密

開始動手吧,先做一個操作用的網頁並且在上面放兩個按鈕,一個用來加密字串一個用來解密字串,然後在按鈕的Click事件中寫入下面的程式。


現在使用者只要按個按鈕就能完成加解密的動作了,這下他可沒話說了吧。

動態修改SiteMapPath路徑

| 原始連結


在網頁上放置一個SiteMapPath可以提供使用者一個清楚的瀏覽路標指示,如果你的SiteMap是靜態不會變動的倒是很簡單,只要編寫好一個XML檔放上去,其它的事就可以不用管了,但是在動態網頁中SiteMap的路徑可能會隨著不同的情況而有所更動,這時預先建立的靜態SiteMap似乎就不怎麼好用了,因為你無法事先去預測SiteMap該有哪些路徑(就像現在這個論壇上面的SiteMap),這個時後你必需要用程式動態控制SiteMapPath中Node的連結路徑及顯示的文字,現在只要跟著下面的步驟做就可以簡單的做到這個功能。

1. 先在Web Form中建立一個ModifyPath方法

2. 在Page_Load 中註冊SiteMapResolve事件給ModifyPath方法
3. 最後在ModifyPath中撰寫動態路徑及所顯示的文字程式碼即可
好了,你現在應該可以看到一點點成果,至少SiteMapPath中的結點能被程式控制了,剩下的只需要寫出ModifyPath中真正的取得路徑的程式碼,動態修改SiteMapPath就是這麼簡單。

將Big5中文字碼POST給外部網頁

| 原始連結

這真是一個令人頭痛的問題,全世界有各式各樣的編碼,每次看到充滿問號的網頁真是教人想要抓狂,幸運的是 ASP.NET 採用 Unicode 編碼所以不論你是用中文、日文、或是火星文符號都沒有問題,那些該死的問號不會再佔滿整個畫面,說真的,自從進入 .Net 的領域我就不再因為字碼轉換失眠,不過編碼的問題依然存在,原因是那些使用big5碼的系統不可能一夜之間全部換掉,如果你開發一個需要跟java整合的系統就有很大的機會碰上這樣的問題。




這是我遇到的狀況, ASP.NET 網頁會接收 JSP 網頁 POST 過來的 XML 文件並且做一些處理再將處理後的 XML 文件傳送回 JSP 網頁接續以後的工作,但是因為某些原因 JSP 網頁只接受 big5 編碼而不能處理 Unicode 的字串所以最後只會在資料庫裏留下一堆問號,這種情況你就需要在將文件 POST 出去之前,先執行編碼轉換然後再用 HttpResponse.BinaryWrite() 方法將二進位字元的字串寫入 HTTP 輸出資料流,來一段真實的範例你會發現原來是這麼簡單不過的事了。

使用 Cache 來增加系統效率

| 原始連結

時間就是金錢這道理大家都知道,但些事不見得人人都能有深刻的體認,對於擁有大量使用者的企業網站而言,只要能想辦法讓每個頁面減少一點點的系統負擔,那麼就可以相當幅度的降低運作成本。

以一個 Web-base 系統來說會產生成本的因素有幾項

  1. 網站的流量
  2. 商業邏輯的複雜運算
  3. 資料處理
  4. 系統安全防護

當使用者瀏覽一個從資料庫讀取數據後顯示在頁畫中的應用程式,在這一瞬間系統必需即時的對資料庫伺服器連結、讀取資料、運算及產生顯示頁面,這一切過程看似合理,但是如果有你有機會(時間)去好好檢視你曾經開發的系統,應該不難發現其實有很多的數據顯示不是非要那麼即時的,如果能夠在第一次讀取資料後就將資料 Cache 起來給接下來的數百甚至數千個使用者去瀏覽,直到有新的資料被更新才重新讀取,你將可以為系統節省了大量的資料庫連結及邏輯運算的成本。

在 ASP.NET 中 Cache 便提供了各種不同依賴方式的暫存,MSDN中有詳細說明:
  1. Key dependency
    以 key 值為依賴的暫存,你能把多個項目存入 Cache 中並且依賴指定的 key 值,當這個 key 值被移除了其相依賴的 Cache 項目也就失效。
  2. File dependency
    以檔案為依賴的暫存,你可以把 Cache 項目依賴指定的檔案,當檔案被修改或是刪除其相依賴的 Cache 項目也就失效。
  3. SQL dependency
    以資料庫中 Table 為依賴的暫存,當資料被更動其相依賴的 Cache 項目也就失效。
  4. Aggregate dependency
    An item in the cache is dependent on multiple elements through the use of the AggregateCacheDependency class. If any of the dependencies change, the item is removed from the cache.
  5. Custom dependency
    An item in the cache is configured with a dependency that you create in your own code. For example, you can create a custom Web service cache dependency that removes data from the cache when a call to a Web service results in a particular value.
夠了!! 我知道我英文很爛的事實終於被你發現了。

先不用擔心我在這裏長篇大論,我只想紹介簡單好用的方法來讓你思考如何改善系統效率,好好利用 Cache 的最大利益是可以節省系統資源(尤其是比較昂貴的資料庫存取),把曾經計算過的結果儲存下來再次使用。

首先是以檔案為依賴的暫存,第一次讀取檔案後將資料 Cache ,直到檔案被更改,這可大幅度的減少IO的存取動作,不必每次都去開檔讀檔也不必擔心檔案更新後沒有即時反應在系統中。

我們在物件中有一個Data的屬性,Data屬性的資料來自某個檔案....


就這樣,直到 c:\File.txt 被更新 Cache 就會失效並且自動重新讀取。

另一個要講的是以時間為依賴的 Cache



資料將以20分鐘為一個周期重新讀取。


OK! 結束了。
光是這樣的運用就可以有很棒的效果了,現在你可以好好的回頭檢視自已的系統是否也可以使用 .net 的 Cache ,雖然我明知道大部分的人並不會真的照著做..... 。