[碎碎念] 程式開發領域由菜鳥到老鳥的成長歷程 (24) - 中鳥階段-養成資訊安全的良好習慣

資訊安全雖然產業界喊了很久了,網路上也有很多安全防護的資訊,但是為什麼還是有一堆常見的漏洞被發現?那就不是缺乏知識,而是個人習慣問題。

經過菜鳥階段的歷練,寫程式的速度一定是慢慢的變快,再經過物件導向的洗禮,寫出來的程式會變得很有彈性,可測試也看起來很有 quality,在一切感覺都很美好的時候,有一天資料庫的資料被洗掉了,被植入一大堆的 js 連結,而且這麼剛好又沒備份,完了,沒辦法 recover,程式一查,結果是程式中出現了 SQL Injection 漏洞,一瞬間由天堂掉到地獄,還得要面對來自客戶或老闆排山倒海的壓力,再嚴重一點就是回家吃自己...

以上情節也許看起來像杜撰,但是多少也反映了多數程式師寫程式的壞習慣:不重視資安。這句話不是隨便說說的,由 OWASP 2010 最新的十大安全漏洞來看,Injection Flaw 由一堆安全弱點或漏洞性質中脫穎而出變成第一名,某種程度就反應了 SQL Injection 到現在還是一個程式師很常犯的資安漏洞,XSS 和 SQL Injection 基本上是孿生兄弟,沒有 SQL Injection 的話,XSS 要成功也不容易,因為 XSS 要成功,必須要神不知鬼不覺的把指令碼埋在網站內,才可以在使用者不知情的狀況下竊取資料,而埋指令在網站中的最佳方法,非 SQL Injection 莫屬了。

我們就以 SQL Injection 為例,要滿足 SQL Injection 的條件,必須要有下列先決條件:

1. 在應用程式中使用字串聯結方式組合SQL指令。
2. 在應用程式連結資料庫時使用權限過大的帳戶
3. 在資料庫中開放了不必要但權力過大的功能
4. 太過於信任使用者所輸入的資料。

看倌們自己捫心自問,自己的開發環境有沒有出現上面四種條件的其中一種?這個漏洞在 2002 年左右被揭露,如今過了九年,卻還是有很多系統,很多開發人員寫出來的程式仍然存在這個漏洞,試問是網路上的前輩給的方法不夠?範例程式不足?抑或是沒有一個絕對的方法可以做?其實都不是,因為只要使用資料存取物件的參數 (Parameter),就可以完美的防止 SQL Injection,但為什麼還是有這麼多系統仍存在漏洞?人的問題最大,筆者也在某個論壇中聽到 "用參數寫好麻煩哦" 的說法,所以最大徵結點,就是開發人員自己不願意用安全的寫法做,因為對他來講不方便,要花多那麼一點點時間。筆者也看過不少程式的連線字串是用 "sa" 來連,然後權限給最大,好像他們一點都不擔心哪天會被 DROP TABLE 或 DROP DATABASE 或是更嚴重的 format c: /q ?

再舉另一個類似的漏洞,是出現在 Apache, IIS 或其他伺服器上的 HTTP 動詞竄改漏洞,肇因於對 HTTP 動詞的存取權限,以致於系統門戶大開,讓駭客有路徑可以攻進來。如果開發人員或系統管理人員可以多細心一點,就可以發現這個漏洞並解決它。
安全性是一個程式的品質指標之一,也是客戶對系統是否放心的指標之一,沒人會想買一套整天被人家攻破的系統,而身為系統開發者,是否也該用心來關注一下資訊安全,以及自己寫的程式是否真的安全呢?

References:
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
http://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A
http://ithelp.ithome.com.tw/question/10080209
http://www.dotblogs.com.tw/regionbbs/archive/2011/08/26/http.verb.tampering.aspx