Jen

什麼是 web 開發人員【最重要的小事】

真他媽的是有感而發,故事是這樣的…

有一個私底下常合作的朋友,在前一陣子某個星期二晚上,正在家看書的我(裝乖),接到他的來電,電話那頭的他說有個很急的案子,是國內某大遊戲代理商他們外包給個人工作室的案子,後來那個程式人員做一做跑了,而專案的前後台資安檢測結果有300多個需要修改的弱點,看了一下資料庫也才幾個表格,不算大案子,怎麼一經資安軟體檢測有300多個錯誤,過3天案子就要上線,要給大老闆看,拜託我是否能幫忙改這個檢測的部分。

首先我先看他的弱點有哪些,看完了整個程式專案,發現其實也沒有多難改,因為全部都是最基本的SQL Injection,XSS,CSRF,這些最基本該做到的弱點防範,都沒做到,雖然他是用舊式的ADO.Net做法,但從2.0開始,.Net Framework就 已經提供足的 solution 來解決這方面的問題,我很懷疑,為什麼這樣的程式設計師也敢出來個人接案? 會看一點程式,會複製貼上,就要出來跟人家混飯吃,我越看越生氣。生氣的點並不是在說他搞了一個爛攤子,結果由我來做(其實我也可以拒絕),只是憑什麼他敢出來獨立接案,而又不付責任的走了。

下面要講的就是 web 開發人員 【最重要的小事】,千真萬確都是最基本該做到的,如果你是web應用程式的程式設計師,如果有不懂的,就勸你不要再出來害人了,丟臉啊。

【SQL Injection】
最基本常見的就是串資料庫 SQL 語法,而對於clinet 端所傳入的參數,沒有做任何白名單或黑名單的驗證,再加上SQL權限管理一沒做好,任何人就可以對你的資料庫做任何事,以下是我所看到的程式碼。

String sqlCom = "select * from dbo.member where name='" + textbox1.text +  "'";
很幸運的是,在我大學開始做web ap的時候,就有一個很棒的團隊朋友,剛好那時候.Net進入2.0的年代,都在用Typed Dataset來與資料庫做溝通,這樣串SQL的方式我真的倒一行都沒寫過(不過老實說,在很久很久以前,我曾用jsp這樣串過語法,不過那只是交作業啦)。現在.Net與資料庫溝通有Linq to SQL、Entity Framework、Java 有 hibernate、Python有 Autumn 等 O/R Mapping 等技術,基本上就提供了很不錯的Injection防護作用。

而這個部分怎麼解呢? 用 SqlParameter 就對了啊,還要sample code嗎? google 打上SqlParameter 就有一堆解,沒那麼難吧。

【XSS】
就是可以讓Client端使用者任意的輸入html tag,或者是從資料庫來的資料,未經認證,也未經Html Encode,就直接Response到View的頁面,尤其是帶有script的tag,有心人士可以藉由外部的java script,取得cookie,取得cookie 又怎樣呢? cookie 通常都存有session_id 或者是一些機密資料,這樣一來就可以取得其他人的機密資料。

還有我看到他引用外部網站的 java script,當然這裏指的不是google map提供的那種外部script,是直接引用別人網站的script,如果對方有trace到你的ip,及你的網站在使用他的script,他也可以任意的取得你的網站使用者的機密cookie。

最好的做法是白名單,不管是接參數還是render 參數到view當中,建立白名單是最安全的作法,再來就是建立黑名單,直接html .Encode 也是能解決直接印出tag的問題,但是有些資安檢測軟體是不吃這一套,非常嚴格。

【CSRF】
跨網站的假要求,假設你今天有一個申請會員的功能頁,post的url為apply.aspx,帶2個參數,帳號及密碼,即可申請到會員,那麼我只要用程式不斷送帶有參數的request,就可以一直新增許許多多的會員,解決辦法很簡單,只要在每次runtime時,產生一個valid key到client,而server在每次被request的時候,需要去檢查這個valid key,最簡單的說就是提供驗證碼。

其實 .Net Framework有提供ViewState 加密的這個 hidden value,他都用.Net Framework了,還能被檢測出這個弱點,我真是他媽的佩服他了。雖然我不是個很優秀的programer,但是基本該做的,我至少都會做到,這個案子讓我真的見識到了什麼才是出來騙吃騙喝的,有夠扯了。

以上是程式人員該自覺的部分,話說回來那家國內首席的遊戲代理商也真是的,找外包也不會找,我想多半是貪小便宜,不管是什麼東西都是一分錢一分貨,寫程式這東西,便宜一定沒好貨的,相信我。

0 意見: