2010年7月25日

網站安全- 攻擊與消毒

由於聽過太多網站被攻擊的消息
自己在建制網站的時候一天到晚都在想自己會被怎樣攻擊
也害怕我的網站使用者被其他使用者攻擊
今天翻了一些文章和一些書發現有一些我想像的攻擊是不會發生的
還有許多常見的攻擊和解決方法 我就挑我的網站可能遇到的來看

Script insertion, XSS (Cross-Site Scripting), DoS (Deny of Service)
這些是比較有可能發生在我身上的
前兩者主要是壞人將惡意程式碼植入到網站的資料區
在其他使用者讀取資料或是跟網站互動的時候就會自動(或是被動)的執行這些程式碼
常見的攻擊比如說url redirect或是cookie hijacking等等
消毒的方法主要是在網站資料"輸出"的時候做escape來讓惡意程式碼失效
因為在資料庫內的資料可能為其他API所用 所以在輸入的時候可以不及著過濾
但是如果以資料來當作連結位置
比如說<a href=$url>或是<img src=$src>的時候(就是我自己遇到的問題)
escape也沒有效, 最好在資料寫入的時候就做判斷
把javascript, \0(nul攻擊), \r\n \' \"這些東西先過濾掉
如果是以資料當作script和style的來源則幾乎沒有100%安全的防治方式
要保護cookie的話
網路上則有人建議在set-cookie的最後面加上HttpOnly來防止Javascript存取
但是我應該不會這麼做 因為我沒有存重要資料在cookie裡面,
而且用Javascript來使用一些cookie我覺得還滿方便的

還有一種攻擊我忘記名稱了@@"
可以發出合法的資料 但是卻能給予其他使用者被動攻擊
我只記得必須要去檢查request header裡面的referer
確保是自己發出來的request就行了

Dos就主要是對網站本身的攻擊
比如發出大量的request來讓伺服器無法提供服務給其他使用者
我自以為在Ajax裡面要發生是比較困難的
但是我可能會盡量多發揮cache的功能

最後,不知道GQL有沒有內建避免類似SQL injection發生的功能
但是基本上我也打算一併做掉比較安心 畢竟這能夠造成的傷害恐怕是最大的

總結:
1.在網站收到資料的時候要對資料保持懷疑的態度,對資料做徹底檢查
該是整數就是整數,該符合某個正規表示就好好的過濾一發
還要檢查request的來源

2.在網站輸出的時候要做escape

備註: