關于ASP編程中安全性問題的解決方案
作者:tank 日期:2005-01-09
關于ASP編程中安全性問題的解決方案
1、問題描述
標準的HTML語句或者javascript語句會改變輸出結果
例如:
在留言板中,我們在留言內容中打入:
<font size=10 color=red>你好</font>
如果你的ASP程式中沒有遮罩html語句,那麼就會改變"你好"字體的大小。
又比如:
在輸入框中寫個 javascript 的死循環:
<a herf=http://someurl onMouseover="while(1){window.close('/')}">特大新聞</a>
那么其他查看該留言的客人只要移動鼠標到"特大新聞",上就會使用戶的瀏覽器因死循環而死掉。
解決方法和建議:
編寫類似程序時應該做好對此類操作的防范,譬如可以寫一段程序判斷客戶端的輸入,并屏蔽掉所有的 HTML、 javascript 語句。利用下面函數HtmlEnCode()處理:
Function HtmlEnCode(str)
'替換空格符號
str=Replace(str," "," ")
'替換字符"<",">"
str=Replace(str,"<","<")
str=Replace(str,">",">")
'替換行
str=Replace(str,chr(13),"
")
HtmlEnCode=Str
End Function
2、問題描述
用戶COPY下表單后,修改ACTION到指定的URL
例如:
新建一個發布頁面,未加入客戶端的數據合法性檢查代碼,若指定表單ACTION到提交頁面,則通過你的程序入口,可向數據庫輸入不合法的數據,或導致數據庫出錯。
解決方法和建議:
通過下面的過程可以解決:
Sub CheckSubmit(Dir)
Dim ParentURL,ChildURL
'讀取上一個跳轉頁面的地址,并且轉換為小寫字符竄
ParentURL=lcase(Request.ServerVariables("HTTP_REFERER"))
ChildURL=lcase("http://www.kupage.com/"&Dir)
If Instr(ParentURL,ChildURL)=0 Then
StrTemp="
<li>您的提交文件不合法!"
Call ShowErrMsg(StrTemp) ‘ShowErrMsg()出錯提示過程
End If
End Sub
備注:
1)使用此過程時,預先要在ChildURL中輸入本站域名,注意不能輸入IP地址,應為HTTP_REFFERER返回的參數為域名。
2)傳遞的參數Dir是當前的文件所在的相對目錄路徑。
3)如果這個網站有2個或2個以上的域名指向,可以在條件語句上并列一個條件,如果域名www.51hu.com也指向這個IP地址(更多如法炮制),條件語句頭可以一下判斷:
If Instr(ParentURL,ChildURL)=0 and Instr(ParentURL,lcase(“www.51hu.com”&Dir)) Then
3.問題描述
用輸入框修改SQL語句
解決方法和建議:
屏蔽掉’ “ & +等符號,注意當禁止鍵盤輸’”&+等非法符號時,用戶還可能用COPY的方法輸入;還有一種方法就是用一個轉換函數,把非法字符轉換為合法,從數據庫中取出時再轉換回來。
可借鑒如下函數:(在執行SQL命令前對特殊字符進行轉換)
Function AdjustedForSQL(adj_str)
Dim AdjustedStr,I
Adj_str=Trim(adj_str)
AdjustedStr=””
If Len(adj_str)>0 Then
For I=1 To Len(adj_str)
Select Case Mid(adj_str,I,1)
Case”[”:
AdjustedStr=AdjustedStr & “[]”
Case “|”:
AdjustedStr=AdjustedStr & “[{-}]”
Case “’”:
AdjustedStr=AdjustedStr & “[&-()”
Case Else:
AdjustedStr=AdjustedStr & Mid(adj_str,I,1)
End Select
Next
End If
AdjustedForSQL=AdjustedStr
End Function
4.問題描述
點擊后退反復刷新數據庫
例如:
發布頁面中,發布完一條信息后點擊后退,繼續發布,反復操作,會導致系數據庫多余無效數據。
解決方法和建議:
可在時間上對下一次數據庫操作進行控制:
Session("PutInfo")=Now()
在進行數據庫操作時,最好是讀取表單變量之前加下一句
If DateAdd("s",30,Session("PutInfo"))>Now() Then
Response.Write "<script language=javascript>alert(""您發布信息的間隔時間不能低于30秒!"");history.back();</script>"
Response.End
End If
5.問題描述
ASP程序密碼驗證問題
例如:
在用戶名框中輸入任意值,密碼框中輸入ben' or '1'='1 ,這樣就繞過了密碼驗證,將以數據庫中第一個用戶的身份登陸。
解決方法和建議:
1)屏蔽輸入框中的符號” ’ ”
2)在用戶登錄頁面對于用戶名和密碼不要同時加以判斷,只對用戶名進行判斷,根據用戶名在數據庫中查找是否有與之匹配的密碼,再將數據庫中的密碼與輸入框中的內容進行比較
6.問題描述
直接修改瀏覽器中URL傳遞的參數值
解決方法和建議:
1)盡量不要在鏈接中帶重要的參數,在接受參數時應對請求人進行權限判斷。
2)若傳遞的參數為數字,應對傳遞的參數做合法性判斷。