用Dreamweaver開發ASP網站簡單,容易上手,新手可在很短的時間裡編出看來比較完美的動態網站,在功能上,老手能做到的,新手也能夠做到。那麼新手與老手就沒差別了嗎?這裡面差別可就大了,只不過外行人很難一眼就看出來罷了。介面的友善性、運行性能以及網站的安全性方面是新手與老手之間區別的三個集中點。
在安全性方面,新手最容易忽略的問題就是SQL注入漏洞的問題。用NBSI 2.0對網路上的一些ASP網站稍加掃描,就能發現許多ASP網站存在SQL注入漏洞。
所謂SQL注入(SQL injection),就是利用程式設計師對使用者輸入資料的合法性檢測不嚴或不偵測等設計上的漏洞,故意從客戶端提交特殊的程式碼(SQL指令),收集程式及伺服器的信息,取得想得到的資料而進行的攻擊。
可見Sql注入攻擊得逞的主要原因沒有對使用者輸入的資料進行驗證,可以從客戶端動態產生Sql指令。
一般的http請求不外乎get 和post,所以只要我們在程式中過濾所有post或get請求的參數資訊中非法字符,即可實現防範SQL注入攻擊。
遺憾的是DW並沒有提供相關程式碼,因此要想防範SQL注入式攻擊就需要手動修改,
只要將下面的程式儲存為SQLinjection.asp,然後在需要防注入的頁面頭部調用
<!--#Include File=SQLinjection.asp-->
就可以做到頁面防注入.
如果想整站防注,就在DW產生的Connections目錄下的資料庫連線檔案中加入頭部呼叫或直接加入下面程式碼,需要注意的是,在新增到資料庫連線檔案中,可能會在背景表單中新增文章等內容時,如遇到SQL語句系統會誤以為SQL攻擊而提示出錯。
通用程式碼(引自網路做適當更改)如下:
<%
'--------定義部份------------------
dim sql_injdata
SQL_injdata = '|and|exec|insert|select|delete
|update|count|*|%|chr|mid|master|truncate|char
|declare|1=1|1=2|;
SQL_inj = split(SQL_Injdata,|
'--------POST部份------------------
If Request.QueryString<> Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),
Sql_Inj(Sql_DATA))>0 Then
Response.Write <Script Language=JavaScript>
alert('系統提示你!/n/n請不要在參數中包含非法字元嘗試注入!/n/n');window.location=&'&index.htm&'&;</Script>
Response.end
end if
next
Next
End If
'--------GET部份-------------------
If Request.Form<> Then
為 Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write <Script Language=JavaScript>
alert('系統提示你!/n/n請不要在參數中包含非法字元嘗試注入!/n/n');window.location=&'&index.htm&'&;</Script>
Response.end
end if
next
next
end if
%>
透過上述的程序,就可以實現抵禦從Get方法或Post方法提交的危險SQL注入字符,並警告入侵者後轉向到index.htm(首頁)。