大部分的web應用程序會依靠客戶端執行各種措施來控制它提交給服務器的數據,以提高程序的可用性,避免客戶端與服務器來回通信。比如使用javascript來校驗長度是否超長,格式是否正確,使用隱藏html表單字段進行數據傳送,使用url參數傳送數據等等。
但是,這樣做存在一個基本的安全缺陷:用戶能夠完全控制客戶端及提交的數據,即避開任何在客戶端執行但服務器并不采用的控件,直接提交數據給服務器處理。
目前已經有大量的攔截代理服務器的工具。比如firefox的插件temper data,它位于web瀏覽器與目標應用程序之間,可以攔截應用程序發布和收到的每一個http或https請求和相應。我們通過它可以攔截任何客戶端傳遞的消息,并且對其進行檢查或修改,將修改過的內容傳遞給服務器進行處理。
拿一個簡單的實例來說:對于一個輸入框,長度限制為10,客戶端通過了javascript進行校驗,有一個maxlength=’10’,通常我們進行功能測試,會嘗試輸入10 字符和11個字符,超長之后會提示用戶無法繼續輸入,我們認為該功能是正常的。然而,我們可以進一步進行測試:通過代理服務器來攔截這個請求,將內容改為長度為20的內容后繼續提交,接著查看后端服務器應用是否提示錯誤信息,如果沒有錯誤信息提示(有時數據庫字段長度的設置稍微長一些),那說明這里是存在安全問題的。
對于以上安全問題的預防措施,對于重要敏感的信息,比如折扣、價格等,要放到服務器端傳參與校驗等,如果服務器端收到已被客戶端阻止的數據,應用程序應將異常記錄到日志中,在需要的時候向管理員發出警報來監控攻擊企圖。在某些重要敏感的功能中,應用程序還可以主動采取防御措施,終止用戶會話或暫時凍結其賬戶。
綜上所述,由于客戶端組件和用戶輸入不在服務器的控制范圍內,web應用程序會面臨安全威脅??蛻艏捌涮峤坏臄祿举|上講都是不值得信任的。確認客戶生成數據的唯一安全方法是在應用程序的服務器端實施保護措施。
原文轉自:http://www.anti-gravitydesign.com