攻擊網站通常都是通過跨站指令代碼(Cross-siteScripting)攻擊網站的後台漏洞。它和信息隱性代碼攻擊 (SQLInjection)攻擊的目標不同。前者是透過從Web前端輸入信息至網站,導致網站輸出了被惡意控制的網頁內容,使得系統安全遭到破壞。而後者則是輸入了足以改變系統所執行之SQL語句內容的字串,使得系統最終達到攻擊的目的。
但從更一般性的角度來看,這兩種攻擊手法基本上是相通的。他們都是透過系統對於輸入信息的毫無檢核或是檢核不足,利用刻意制造出來的輸入信息,來讓系統產生不在預期內的有害行為。
過濾輸入信息有效嗎?
因此,當要防備這類型的攻擊時,大多數人直覺想到的方式,便是對使用者所提供的輸入信息進行過濾。在面對信息隱性代碼攻擊時,許多人會想到針對 輸入信息中,可能會含有的SQL關鍵字串或字元進行過濾,例如,使用者的輸入信息中若含有單引號,那麼便可能制造出危險的SQL語句,因此,許多程序設計 者便會想到要針對單引號進行escape,來杜絕信息隱性代碼的攻擊。而這種escape或過濾的方法,其實不難規避,例如,針對單引號,有心人士還是可 以利用信息庫服務器支持的特殊寫法,將單引號字元替換成其他的型式,使得escape的程序失效。
同樣的,面對跨站指令代碼攻擊,許多程序設計者首先會想到的,也是針對有可能造成疑慮的使用者信息進行過濾。例如,針對字元、SCRIPT字串 進行過濾,倘若使用者的輸入信息中含有可疑的字元或字串時,則進行改寫或禁止使用。這種針對特定的目標進行篩選過濾的方式,可以稱為黑名單式的過濾,因 為,程序是先列出不能出現的對象清單,然後進行過濾。
當然,在跨站指令代碼攻擊中,如果想利用黑名單式的過濾方式,當然也是行不通的。因為,單是javascript這個字串,有心人士就可以產生 在HTML中等價、但是字串形式不為javascript的寫法。例如,使用#x的十六進位字元表示方式,來表示javascript這個字串中的每一個 字元。由於改寫形式太多了,這使得想要利用黑名單的方式,幾乎是不可能的事。
因此,無論何種攻擊,想要有更嚴密的防備,在信息的過濾上,都應該采取白名單式的過濾。而這正和黑名單相反,它不是列出不被允許的對象,而是列出可被接受的對象。
以正向表列的方式管制
在面對信息隱性代碼攻擊時,我們建議針對每個欄位都明確定義出它該有的形式,例如日期欄位就只能出現數字和斜線字元,而ID欄位,僅能出現英文字母及底線字元等等。如此一來,想要透過信息植入有害的組成,就不是那麼容易可以辦到了。