2007-10-23

ASP網頁該如何改寫,才能強化安全性?

ASP網頁該如何改寫,才能強化安全性?

http://www.ithome.com.tw/itadm/article.php?c=45800

ASP網頁該如何改寫,才能強化安全性?
文/王宏仁 (記者) 2007-10-19

企業現有的網頁如果是ASP的架構,該如何重新檢視、改寫,以強化安全?我們在此想提供一些網頁開發的安全建議,已使用ASP或將採用的企業可以根據這些原則,重新檢視本身的ASP網頁是否需要修改。


對許多中小企業而言,ASP網頁加上微軟Access資料庫的組合,仍舊是容易上手、快速開發的網頁技術,對使用者不多,效能需求不高的小型專案或資料庫網頁應用的開發,綽綽有餘。但也正因為是簡單小型應用,往往也最容易忽略安全,成為資料洩漏的死角。

我們在此想提供一些網頁開發的安全建議。已使用ASP或將採用的企業可以根據這些原則,重新檢視本身的ASP網頁是否需要修改,並且了解調整的方向。

一、不要相信使用者輸入的資料
使用者不一定會輸入適當內容,永遠都需要檢查使用者輸入的資料。可用Server HTMLEncode方法、Server URLEncode方法等方式,來處理使用者輸入的內容。編碼之後,當要顯示使用者輸入的資料,就不會被瀏覽器視為HTML標籤或程式碼,破壞原來網頁內 容。網頁標頭(headers)也可能被竄改,取用時同樣需編碼。

二、避免直接將使用者輸入資料,放到資料庫連線字串中
這會讓使用者有機會放入某些對資料庫系統有特殊意義的符號或命令,就是所謂的資料隱碼(SQL Injection)問題。資料隱碼漏洞會讓使用者能新增、更動或刪除資料,造成資料錯誤或遺漏,若資料庫使用權限是系統管理者時,還可能造成更嚴重的破壞。

若使用SQL資料庫,可使用預儲程序(Stored Procedures)來建立資料庫連線字串。或者是利用SqlDataSource控制項來連接資料庫,分開設定SQL指令所需SQL參數,可避開資料隱碼風險。

已經大量使用SQL字串連線方式的企業,可用replace函數過濾掉輸入內容中某些敏感字元,如單引號、雙引號。至少可避免使用者直接攔截原本的SQL指令。

三、避免用高風險的資料傳輸方式
盡量用POST方式或Session變數來傳遞重要資訊,可減少洩漏風險。用GET傳遞的資料會顯示在網址列,使用者瀏覽到惡意網頁時,也容易被 截走資料(Hijacking)。非要使用GET方式傳遞,應避免將帳號、密碼等機敏資料作為參數。最好使用不易閱讀的名稱,避免被猜出參數的用途。

四、避免將錯誤資訊直接傳遞到使用者瀏覽器端。
當ASP程式出錯時,在錯誤訊息中通常會顯示出許多可供駭客入侵的訊息,例如:SQL查詢敘述、檔案路徑、物件名稱等。可以在程式碼中加上On Error Resume Next指令,避免將錯誤資訊傳遞到使用者端。

五、網頁必須控管存取權限。
對有安全顧慮的網頁(如個人資料),需確定使用者具有讀取該網頁的權限,避免使用者未經過正常登入程序,直接透過網址連結。

最後再提醒你,若網站應用程式搭配的是Access資料庫,應盡量使用無意義或可讀性低的檔名,避免資料庫路徑檔名被猜出而導致被竊,或可設定ODBC資料來源,透過資料來源名稱(DSN)來連線。文☉王宏仁

快速檢查合法使用者的程式碼

使用者成功登入後,建立使用者帳號的Session,例如Session("User_ID")=使用者帳號名稱,每一頁加入Session ("User_ID")是否存在的檢查程式,就能避免來自非原始使用者的連結。你可將以下程式碼加入每一個ASP網頁中檢查:
<%
'避免該網頁被暫存在使用者端
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

'檢查使用者session是否存在
if Session("User_ID")="" then
    Response.Redirect " Login.asp" '不存在,回到登入畫面
    Response.End
end if
%>


iThome歡迎讀者提問,請將你所遇到的各種企業IT疑難雜症,寄至iThome編輯部:QA@mail.ithome.com.tw


--


[垃圾桶] 裡沒有會話群組。 當您有 2000 MB 以上的儲存空間時,誰還需要刪除郵件?!

沒有留言: