2011年12月20日 星期二

ASPNET Security探討

SQL injection的簡介與預防

前言
『程式不是會動就好!』,在安全性上的設計,更是完全的貼切這句話。如果設計出在裸奔的網站(請參考黑大的文章),就算網站上的功能可以正常運作,但千瘡百孔的網站,可能淪為人家的玩物或是提款機。

SQL injection的問題,在前幾年掀起了不少次旋風,甚至包括現在可能還有一堆網站有著同樣的問題,要命的是,根本不需要到駭客等級,就可以把有SQL injection問題的網站搞掛。一個程式設計師寫出來的程式,最要不得的就是有SQL injection的問題,我個人認為那是程式設計師不夠專業,甚至不夠格的表現。這不需要多高深的技巧跟學問,要嘛就是程式設計師偷懶,要嘛就是還不夠專業。

這篇文章簡介一下,SQL injection的基本原理,以及基本的防範措施。

結論
在patterns & practices Developer Center簡單歸納出三個步驟防止SQL injection:
  1. Constrain input.
  2. Use parameters with stored procedures.
  3. Use parameters with dynamic SQL.

補充
  1. web.config的custom error要記得打開,避免讓『使用者』看到詳細的錯誤訊息
  2. 權限這種東西,都是能開越小越好,包括資料庫。
  3. 所謂畫面可能被改變的值,可能包括了Url上的QueryString,post過來的表單資料,甚至於cookie內容假造。
  4. 除非別無選擇,請不要自己用filter黑名單的方式來阻擋XSS或SQL injection。原因:
    • 自己想的黑名單再多,也沒有被全世界使用這麼久的library來得妥當。既然全世界寫.NET的人幾乎都用parameter在阻擋SQL injection,有這麼多人當墊背,就盡量別自己假掰。
    • 就算.NET的Library真的被攻破了,有全世界加整個微軟的工程師在替我們緊張,基本上這種等級的問題,都是一天內就會有work around,下一波的patch就會修正掉。何樂而不為,應該把時間花在真正有價值的地方。



Cross-Site Scripting(XSS)的簡介與預防


這一篇則要介紹在Web上可能容易被忽略的問題:Cross-Site Scripting (原縮寫應為CSS,但要與Cascading Style Sheets區隔,所以簡稱為XSS)。

這篇文章會介紹一下XSS的基本原理,以及在ASP.NET上的防禦措施。



結論
在patterns & practices Developer Center簡單歸納出五個步驟防止XSS:
  1. Check that ASP.NET request validation is enabled.
  2. Review ASP.NET code that generates HTML output.
  3. Determine whether HTML output includes input parameters.
  4. Review potentially dangerous HTML tags and attributes.
  5. Evaluate countermeasures.
工程師最忌諱為了解決眼前的問題,而造成更大且看不見的問題。就像挖了一個洞,不補,只能紙糊上去。後面的人一走過去,就會栽跟斗一樣。當合理的exception出現時,請去瞭解上面的相關資訊,切勿直接在網路上搜尋,或是不明事理的就把一些相關的安全性設定取消。

XSS的影響範圍很大,一旦最前面的資料輸入端沒有先處理好,讓髒資料進去DB後,要找到這些資料並清掉它,不是一件容易的事。身為一個Web程式設計師,SQL injection與XSS是兩個最基本的專業素養,請務必瞭解原理,並學會如何設計防範。


沒有留言:

張貼留言