很多企業現有網站內容的架構,目前還是以ASP搭配Access資料庫的方式,身為一個公司的網站管理者或程式設計人員,該如何重新檢視、改寫,強化網頁程式碼本身的安全設計,避免遭到惡意人士鑽漏洞濫用?
對許多中小企業而言,ASP網頁加上微軟Access資料庫的組合,仍舊是容易上手、快速開發的網頁技術,對使用者不多,效能需求不高的小型專案或者資料庫網頁應用的開發,綽綽有餘。但也正因為是滿足簡單小型的應用需求,往往也容易忽略在安全上的考量,而成為資料洩漏的死角。
我們在此想提供一些網頁開發的安全建議。已使用ASP或將採用的企業可以根據這些原則,重新檢視本身的ASP網頁是否需要修改,並且了解調整的方向。
一、不要相信使用者輸入的任何資料。
使用者不一定會輸入適當的內容,所以永遠都需要檢查使用者輸入的資料。你可以使用Server HTMLEncode方法、Server URLEncode的方法,或者其他編碼方式,來處理使用者輸入的內容。編碼之後,將這些使用者輸入資料放置網頁時,可以確保使用者輸入的資料,不會被瀏覽器視為HTML標籤或程式碼,進而破壞原來設計的網頁。
對於輸入資料的檢查程序上,可以進行三個步驟。第一,限制可輸入的內容只允許輸入正確的資料,可以透過資料類型、格式、長度和範圍來檢查。第二,拒絕已知的錯誤資料,例如禁止某些特殊字元的輸入。第三是清理資料,讓潛在的惡意資料變成安全,例如刪除空字元或移除空格。這幾個步驟,可以降低使用者輸入資料可能衍生的資安風險。
二、避免直接將使用者輸入資料,放到資料庫連線字串中。
這會讓使用者有機會放入某些對資料庫系統有特殊意義的符號或命令,這就是所謂的資料注入(SQL Injection)問題。有這方面問題的網頁,使用者可以新增、更動或刪除資料庫的資料,造成資料錯誤或遺漏。如果使用資料庫時的權限是系統管理者,還可能造成更嚴重的破壞,例如得到最高資料庫控制權等,波及其他資料庫。
如果使用SQL資料庫,可以使用預儲程序(Stored Procedures)來建立資料庫連線字串。或者是利用SqlDataSource控制項來連接資料庫,可以將SQL指令(如新增、刪除、查詢)所需的SQL參數分開設定,避免使用SQL字串的方式進行資料庫連線。
若已經於ASP網頁中大量使用SQL字串的資料庫操作方式。也可以於使用者輸入字串後,使用replace函數過濾掉使用者輸入內容中某些敏感字元,如單引號、雙引號。至少可防止使用者,即使攔截了原本的SQL指令,加入自己的指令,也不會造成破壞的危險。
三、避免使用GET的方式傳遞資料。
盡量採用使用POST方式傳遞資料,可以減少資料洩漏的機會。透過GET傳遞的資料會顯示在網址列,使用者無意瀏覽到惡意網頁時,透過GET傳遞的資料容易發生被截走的風險(Hijacking)。
若非要使用GET方式傳遞,也應該盡量避免將使用者帳號、密碼或其他機敏資料作為參數。最好使用不易直接閱讀的英文名稱,作為傳遞的參數名稱,避免使用者猜出參數的用途,進而造成系統被入侵的可能性。
四、取得網頁標頭(headers)資料時,也需要加以編碼(Encode)。
透過瀏覽器變數取得的網頁標頭資訊(HTML headers),例如最常查詢的瀏覽器版本資訊或使用者網址等,並不一定是正確的資訊。駭客能夠攔截或偽造這些標頭資訊,在正確的資訊中,夾帶其他惡意資訊。因此,也必須將標頭資訊視同使用者輸入的資訊,一樣進行資料過濾和編碼處理。
五、不要使用Cookies或者網頁隱藏輸入欄(Hidden Input Field)來存放敏感資訊。
盡量使用Session變數的方式,傳遞重要資訊。若一定要使用Cookie儲存,也盡量先將資料加密後再儲存,避免直接被讀取造成洩漏。
例如經常可以看到,網站會將使用者的登入帳號密碼,存放在使用者端電腦中的Cookie中,以方便使用者下次登入時,不用再輸入任何資訊。為兼顧方便性與安全性,最好將帳號與密碼資料,與使用者電腦資訊,例如網址等,組合後,進行加密後,再儲存於使用者端的Cookie中,可避免資料被其他人讀取時,也不易解密。使用者電腦資訊組合加密,也能避免儲存登入資訊的Cookie被竊取到其他電腦中使用。
六、不要使用預設的資料庫管理帳號,例如sa。
可依據不同的使用需求,建立新的資料庫管理帳號,同時刪除預設的管理帳號。上線資料庫中不需要的資料表,如範例資料表或不需要的系統資料表,最好都刪除。也盡量避免在ASP網頁中提到管理帳號或密碼。
七、避免將錯誤資訊直接傳遞到使用者瀏覽器端。
當ASP程式出錯時,在錯誤訊息中通常會顯示出許多可供駭客入侵的訊息,例如:SQL查詢敘述、檔案路徑、物件名稱等。可以在程式碼中加上On Error Resume Next指令,或者在ASP.NET中還可以使用try CATCH指令,自訂錯誤訊息的處理方式,避免將錯誤資訊傳遞到使用者端。
八、針對有安全顧慮的網頁(例如個人資料檢視網頁),必須控管存取權限。
透過權限檢查,確定使用者具有讀取該網頁的權限,避免使用者未經過正常登入程序,直接透過網址連結。
最後再提醒你,若網站應用程式搭配的是Access資料庫,應盡量使用無意義或可讀性低的長檔名,盡量將資料庫檔案存放在網站跟目錄。可降低資料庫路徑檔名被猜出,而導致檔案直接被下載竊走的風險。最好是設定ODBC資料來源,透過資料來源名稱(DSN)與資料庫連線。