摘要:介紹了ASP的工作機理和用ASP開發網站存在的安全性問題,提出了相應的解決方法。并給出一些提高ASP安全性的建議。這些方法也適用于分析和解決其他ASP的安全漏洞。
關鍵詞:ASP;腳本;加密;數據庫
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)34-1848-02
Talking about the Security of ASP Code and the Defence Measure for Hacker
ZOU Ben-na
(Party School of Huludao City, Huludao 125000, China)
Abstract: This introduces the working mechanism and web security of ASP, and sets out some measures. In this paper, some advice is put forward to improve the web security of ASP. And these analyses and measures are also befitting for other kinds of ASP leak.
Key word: ASP; script; encrypt; data-base
1 引言
現在的SQL注入攻擊很嚴重,各大網站幾乎都有被攻擊的經歷。由于ASP的易學性和普遍性,很多站點都選擇了使用ASP語言來共建自己的Web站點。
Microsoft Active Server Pages(ASP)是服務器端腳本編寫環境,使用它可以創建和運行動態、交互的Web服務器應用程序。微軟推出的IS+ASP的解決方案作為一種典型的服務器端網頁設計技術,被廣泛應用在網上銀行、電子商務、聊天室、搜索引擎等各種互聯網應用中。ASP是開發網站應用的快速工具,但是有些網站管理員只看到ASP的快速開發能力,卻忽視了ASP安全問題。本文試圖從開放了ASP服務的操作系統漏洞和ASP程序本身漏洞闡述ASP的安全問題,并給出解決方法或者建議。
由于ASP的方便易用,越來越多的網站后臺程序都使用ASP腳本語言。但是, 由于ASP本身存在一些安全漏洞,稍不小心就會給黑客提供可乘之機。事實上,安全不僅是網管的事,編程人員也必須在某些安全細節上注意,養成良好的安全習慣,否則會給自己的網站帶來巨大的安全隱患。目前,大多數網站上的ASP程序有這樣那樣的安全漏洞,但如果編寫程序的時候注意一點的話,還是可以避免的[1]。
ASP語言為腳本級變成語言,是以VB Script或者JAVA Script為基礎的,更多的站點選擇了VBScript對異常進行的捕捉(Debug)和數據類型的聲明要求都相對JAVA Script寬松得多,沒有強制要求,這樣帶來了方便也帶來了隱患(由于一些程序員的習慣,在使用VBScript編寫ASP程序時常常忽略了對機場的捕捉(Debug)和數據烈性的聲明),所以在防止Web注入攻擊方面就想的“心有余,而力不足”。
2 防止文件被非法下載
2.1 避免包含文件被下載
在網站設計中,為了便于管理和維護,我們常將程序設計成多個模塊,然后用服務器的包含文件命令將各模塊包含在某一程序當中[2]。過去許多程序員喜歡將這些文件以*.inc形式命名,但是ASP腳本環境只能解釋以特定后綴名的文件,如*.asp,*.asa,*.htm等,對于*.inc的文件,ASP腳本環境無法對其解釋,web服務器則將其直接下載到本地瀏覽器,從而暴露ASP程序的各種重要信息。為避免這種情況發生,我們將*.inc改名為*.asp,這樣即使包含文件的地址暴露,瀏覽者也無法將其源碼下載到本地。
2.2 避免Access數據庫文件被下載
用Access數據庫結合ASP編制小型Web程序,簡單實用,深受廣大程序員的喜愛,但是用這種方式編程需將Ac-cess的數據庫文件存于ASP程序目錄之下,如同上面的第一點所論述的一樣,一旦瀏覽者獲知了數據庫文件的具體地址,數據庫文件將會被瀏覽者下載到本地,從而暴露大量的重要信息。但是我們如果將Access數據庫的文件*.mdb改名為*.asp或*.asa,則即使瀏覽者獲知了數據庫文件的具體地址,當瀏覽者試圖下載這些*.asp文件時,瀏覽者將會碰到訪問錯誤,數據庫在瀏覽器以亂碼顯示,同時在數據庫的連接字符串,我們將相應的*.mdb改為*.asp或*.asa并不會影響程序對數據庫的正常訪問。
2.3 防止下載地址暴露
有時為了方便使用或其它一些原因,我們想將某些程序或資料提供下載但同時對些文件或資料下載時能進行訪問授權控制,因此我們不能暴露我們的下載地址。我們可將文件或資料下載地址存儲在數據庫中,需要時再動態地從數據庫中提取這些地址,最后我們用的地址轉移語句(Response.Redirect\"\")將文件或資料直接下載到客戶端,這樣客戶端將只會顯示文件名而不會顯示具體的下載地址,從而達到了隱藏下載地址的目的[3]。
3 數據庫安全
3.1 設定合適權限的數據庫用戶
現在較為大型的ASP程序多采用SQL數據庫,SQL數據庫安裝時默認的用戶是Sa,許多程序員喜歡將此用戶作為Web程序訪問數據庫的用戶,這是非常危險的作法,因為Sa在SQL數據庫中具有超級用戶的權限,它可以操作任何數據庫,并可操作注冊表,甚至能執行外部程序,一旦黑客通ASP程序非法入侵SQL數據庫,后果將不堪設想。因此我們在使用SQL數據庫作為ASP程序的后臺數據庫時,一定要為ASP程序設定一個只能訪問必要數據庫的SQL數據庫用戶,這樣系統的安全性將得到極大提高[4]。
過濾變量輸入中的非法字符和改造危險的SQL語句黑客通ASP程序非法入侵數據庫,大多是利用ASP程序中的SQL語句設計漏洞構造疇型的SQL語句達到入侵數據庫的目的,如很多網站把用戶名和密碼放到數據庫中,在登陸驗證時用以下sql:
sql=\"select*from user where username='\"username\"'and pass='\"pass'\"
此時我們只要構造一個特殊的用戶名:如ben'or'1'='1,此時實際訪問數據庫的sql語句將變為:
sql=\"select*from user where username='ben'or'1'='1'and pass='\"'\"pass'\"
由于'1'='1'永遠為真,這個語句將返回真值,所以驗證通過。對于這類入侵,我們一方面要改造我們的sql語句,如上述語句可改為:
sql=\"select*from user where username='\"username\"'
查詢數據庫后,取得結果集Rs,再以下方式判別:
If Not Rs.Eof Then
If Rs(\"password\")=password Then
授權進入
Else
拒絕訪問
End If
Else
拒絕訪問
在無法判斷我們的SQL語句是否安全時,一種更通用的辦法是將變量傳給SQL語句時,對變量進行過濾,如:
Replace(Str,\"'\",\"''\")'過濾逗號
Replace(Str,\";\",\"\")'過濾分號
Replace(Str,\"-\",\"\")'過濾\"-\"
或判斷用戶輸入數據的類型:
IfIsNumeric(Request.QueryString(\"ID\")=FalseThen
Response.Write(\"非法輸入\")
Response.End
End If
經過變量過濾后,大量SQL入侵將難于成功。
3.2 限制站外數據提交和頁面的直接訪問
有很多時候,SQL入侵是通過在瀏覽器地址欄中直接構造精心設計的SQL查詢語句或通過網頁中構造偽造的查詢表單向服務器提供虛假數據,達到欺騙服務器的目的,這是一種通過站外提交數據入侵服務器的方法。對于這類入侵,通常有兩種方法進行防范。
一種方法是在需要控制訪問的頁面加入Session變量一旦瀏覽者試圖直接訪問受控制訪問的頁面時,當程序判定特定的Session變量為空時,則強制將頁面轉向訪問的起始頁。這種方法通常對需要提供密碼才能訪問的頁面比較有效。設計者需要注意的是,在合法訪問結束后,要注意通過將特定的Session變量賦值為空或用Session.Abandon語句將所有Session變量釋放。這種方法的缺點有三點:
1) 當用戶的訪問量很大時,服務器上的Session變量的資源銷耗將很大。
2) Session變量的機制在客戶端實際上是通過Cookie方式來實現的,客戶有時為了安全會將Cookie功能關掉,這將使瀏覽者無法訪問有Session變量控制的網頁。
3) 當程序的特定Session變量還處于活動期間,程序也無法控制瀏覽者的站外數據提交[5]。
3.3 數據庫內容加密
一般情況下,用來驗證用戶合法身份的賬戶信息都存儲在數據庫中,通常情況下程序員都以明文形式將賬戶信息存儲在數據庫中,這種情況使程序存在極大的安全隱患,一旦數據庫被黑客意外獲取,賬戶信息將暴露無疑。如果我們將賬戶信息加密后存儲于數據庫中,將大大增加黑客獲賬戶信息的難度,從而增加web程序的安全性。
3.4 ASP安全建議
1) 安裝NT最新的補丁。微軟的主頁有最新的補丁,一般來說微軟都會及時公布最新的漏洞和補丁。
2) 關閉沒有用的服務和協議。“盡量少開沒用到的服務”,這永遠是網絡安全的準則。如果開啟了某個服務,你就要面對不少的漏洞困擾,更重要的是你還要時時提防未來由這個服務所引起的漏洞。
3) 設置好你的服務器,盡量不使用遠程管理軟件,關閉不用的TCP /IP的端口。
4) 磁盤格式使用比較安全的NTFS格式,并設置各目錄的屬性。
5) 不要把密碼、物理路徑直接寫在程序中,把用戶名和密碼保存在虛擬路徑的數據庫中。
6) 使用日志將用戶的瀏覽器、用戶停留的時間、用戶IP、其他管理員操作記錄等信息保存起來。
7) 使用身份驗證機制保護被限制的ASP內容。
8) 保護源數據庫,訪問源數據庫的ASP腳本需要Web服務器所運行的計算機的管理員權限。
9) 安裝放火墻。
10) 使用SSL維護應用程序的安全。
4 結束語
本文分析了ASP服務器端腳本編寫環境存在的一些安全方面的漏洞和幾種常見的保護ASP代碼安全的方法。現在很多網站特別是電子商務網站,在前臺大都用ASP來實現。ASP是開發網站應用的快速工具,但是除了利用ASP的快速開發能力外,還應考慮ASP安全問題,特別是涉及到公司的保密技術或產品信息等,盡量避免因程序中存在漏洞降低數據的安全性。
參考文獻:
[1] 儲岳中.ASP.NET應用程序安全缺陷及預防策略[J].安徽工業大學學報,2007(7).
[2] 陳波,楊宜民.ASP環境下的網絡安全分析[J].微機發展,2003,12(13).
[3] 王國榮.ActiveServerh9 esWeb數據庫[M].北京:北京人民郵電出版社, 2000.
[4] 張文增,林曉森.ASP網站安全研究[J].計算機工程,2002,28(3).
[5] 張海林,杜忠友.基于ASP.NET技術的安全網站設計[J].商場現代化,2007(2).