任莉
(南京工程高等職業(yè)學(xué)校,江蘇 南京 211135)
淺析數(shù)據(jù)庫的安全與優(yōu)化
任莉
(南京工程高等職業(yè)學(xué)校,江蘇 南京 211135)
數(shù)據(jù)庫系統(tǒng)的高性能設(shè)計且系統(tǒng)管理先進,并支持Windows圖形化管理工具以及本地和遠程的系統(tǒng)管理和配置。它強壯的事務(wù)處理功能,采用各種方法保證數(shù)據(jù)的完整性,與Internet的緊密集成和開放的系統(tǒng)結(jié)構(gòu),為廣大的用戶、開發(fā)人員和系統(tǒng)集成商提供了一個出眾的數(shù)據(jù)庫平臺,因此數(shù)據(jù)庫的安全與優(yōu)化變得非常重要。
數(shù)據(jù)庫 ;安全;存儲
隨著計算機技術(shù)與網(wǎng)絡(luò)通信技術(shù)的發(fā)展,數(shù)據(jù)庫技術(shù)已成為信息社會中對大量數(shù)據(jù)進行組織與管理的重要技術(shù)手段及軟件技術(shù),是網(wǎng)絡(luò)信息化管理系統(tǒng)的基礎(chǔ)。數(shù)據(jù)庫技術(shù)研究解決了計算機信息處理過程中大量數(shù)據(jù)有效地組織和存儲的問題,在數(shù)據(jù)庫系統(tǒng)中減少數(shù)據(jù)存儲冗余、實現(xiàn)數(shù)據(jù)共享、保障數(shù)據(jù)安全以及高效地檢索數(shù)據(jù)和處理數(shù)據(jù)。
維護數(shù)據(jù)庫系統(tǒng)的安全是一個長期的工作,是數(shù)據(jù)庫設(shè)計工作的延續(xù)和提高。通常數(shù)據(jù)庫安全的工作包括以下幾個方面:
(1)數(shù)據(jù)庫的安全性。在數(shù)據(jù)庫運行階段,就應(yīng)該保證數(shù)據(jù)的安全,使數(shù)據(jù)庫不受有意或無意的侵犯。
(2)數(shù)據(jù)庫性能的監(jiān)督、分析和改造。數(shù)據(jù)庫管理員必須利用系統(tǒng)提供的性能監(jiān)控和分析工具,經(jīng)常對數(shù)據(jù)庫的運行、存儲空間及響應(yīng)時間進行分析。
(3)數(shù)據(jù)庫的轉(zhuǎn)儲和恢復(fù)。數(shù)據(jù)庫管理員要定期地把整個數(shù)據(jù)庫復(fù)制到磁盤或其他磁盤上保護起來。要指定不同的備份方案,保證一旦發(fā)生事故,能很快地將數(shù)據(jù)庫恢復(fù)到某種一致性的狀態(tài),盡量減少損失。
(4)數(shù)據(jù)庫的重組織與重構(gòu)造。對數(shù)據(jù)庫進行重組可以調(diào)整系統(tǒng)在運行過程中由于不斷進行插入、刪除和修改操作而造成數(shù)據(jù)庫的物理存儲情況變差,數(shù)據(jù)的存儲效率降低、數(shù)據(jù)庫的性能下降的現(xiàn)象,使得系統(tǒng)的性能提高。
數(shù)據(jù)訪問是Web應(yīng)用程序最常需要用到的功能,對數(shù)據(jù)庫性能優(yōu)化,可提高整個系統(tǒng)的性能。
1.數(shù)據(jù)庫鏈接
操作數(shù)據(jù)庫最經(jīng)常應(yīng)用的操作就是創(chuàng)建數(shù)據(jù)庫鏈接,打開鏈接,最后在操作結(jié)束后關(guān)閉鏈接。這一系列操作過程是非常耗資源的,需要多次與數(shù)據(jù)庫交換信息以通過身份驗證。因此這些操作會嚴重影響應(yīng)用程序的性能。ASP.NET可以應(yīng)用鏈接池來對數(shù)據(jù)庫鏈接進行操作,減少打開、關(guān)閉數(shù)據(jù)庫操作對性能的影響。當開發(fā)者創(chuàng)建數(shù)據(jù)庫鏈接時,系統(tǒng)將為其創(chuàng)建鏈接池,從鏈接池中返回開發(fā)者要求的數(shù)據(jù)庫鏈接。當開發(fā)者將這個鏈接關(guān)閉時,系統(tǒng)收回鏈接,將其放回鏈接池,等下一次對該鏈接的請求。但是鏈接池的大小是有限制的,如果超過鏈接池的最大限度后繼續(xù)要求創(chuàng)建鏈接,將會影響性能。因此,要盡量推遲打開數(shù)據(jù)庫鏈接,在數(shù)據(jù)操作完成后及時關(guān)閉數(shù)據(jù)庫鏈接,從而減少數(shù)據(jù)庫鏈接打開的時間,避免超出鏈接限制的情況出現(xiàn)。
2.數(shù)據(jù)庫查詢
在數(shù)據(jù)操作中,數(shù)據(jù)查詢操作是非常普通的操作。提高數(shù)據(jù)查詢操作的性能將對提高應(yīng)用程序性能有很大的幫助。ASP.NET提供了多種方式來使用SQL語言對數(shù)據(jù)庫進行操作,下面對這些方法進行簡單的介紹。
直接生成SQL語句字符串。應(yīng)用SqlCommand對象的CommandText屬性,直接生成SQL語句字符串進行操作,下面的代碼演示了該方式的數(shù)據(jù)庫操作:
SqlCommand comm=new SqlCommand(SqlName,MyConnection);
Stringsql=“Select*Fromstu”;
sql=sql+“where(stuID=”“+txtstu.Text+”“)”;
comm.CommandText=sql;
對于這種查詢命令,SQLServer在應(yīng)用時需要每次對其進行編譯,因此性能較差而且還會帶來其他一些安全應(yīng)用問題。
使用帶有參數(shù)的SQL命令。這種應(yīng)用的實現(xiàn)效果相同。下面為其應(yīng)用程序。
SqlCommandComm=new SqlCommand(SqlName,My-Connection);
StringSql=“Select*FromstuWherestuID=@stuID”;
SqkParameterParaID=newSqlParameter(“@stu”,SqlDbType.Int,4);
ParaID=n,Value=3;
Comm.Parameters.Add(ParaID);
Comm.CommandText=Sql;
使用第二種方式對數(shù)據(jù)庫進行查詢,SQLServer只對命令編譯一次,對于不同的參數(shù)重復(fù)使用,節(jié)省了服務(wù)器的應(yīng)用效能,提供了數(shù)據(jù)庫服務(wù)器的性能。
3.使用儲存過程
存儲過程是一系列被查詢處理器預(yù)解析和優(yōu)化的SQL命令,這些命令會被存儲起來,以便需要時得到快速的執(zhí)行。存儲過程在應(yīng)用時具有一次編譯多次應(yīng)用的效果,而且存儲過程獨立于程序,編譯修改和維護。并且存儲過程還可以減少網(wǎng)絡(luò)中的數(shù)據(jù)傳輸,進一步提高網(wǎng)絡(luò)應(yīng)用性能。多條SQL語句的查詢操作只需要由一個存儲過程就能夠?qū)崿F(xiàn),可以避免多次向數(shù)據(jù)庫服務(wù)器傳送數(shù)據(jù)。
SQL注入是從正常的WWW端口訪問,而且表面看起來跟一般的Web頁面訪問沒什么區(qū)別,在代碼使用存儲過程中,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞時,會發(fā)生SQL注入。SQL注入可能導(dǎo)致攻擊者使用應(yīng)用程序登錄在數(shù)據(jù)庫中執(zhí)行命令。如果應(yīng)用程序使用特權(quán)過高的用戶鏈接到數(shù)據(jù)庫,這種問題會變得很嚴重。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造動態(tài)SQL命令,或者作為存儲過程的輸入?yún)?shù),這些表單特別容易受到SQL注入的攻擊。
SQLServer是一個功能強大的數(shù)據(jù)庫系統(tǒng),與操作系統(tǒng)也有緊密的聯(lián)系,這給開發(fā)者帶來了很大的方便,但另一方面,也為注入者提供了一個跳板,我們先來看看幾個具體的例子:
(1)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;exec
master..xp_cmdshell“net user name password/add”______
分號;在SQL Server中表示隔開前后兩句語句,——表示后面的語句為注釋,所以,這句語句在SQL Server中將被分成兩句執(zhí)行,先是Select出ID=1的記錄,然后執(zhí)行存儲過程xp_cmdshell,這個存儲過程用于調(diào)用系統(tǒng)命令,于是,用net命令新建了用戶名為name、密碼為password的windows的賬號,接著:
(1)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;exec
master…xp_cmdshell“net localgroup name administrators/add”——
將新建的賬號name加入管理員組,現(xiàn)在你已經(jīng)拿到了系統(tǒng)最高權(quán)限,當然,這種方法只適用于用sa鏈接數(shù)據(jù)庫的情況,否則是沒有權(quán)限調(diào)用xp-cmdshell的。
(3)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;
and db-name()>0 and user>0,作用是獲取鏈接用戶名,db-name()是另一個系統(tǒng)變量,返回的是連接的數(shù)據(jù)庫名。
(4)http://localhost:2514/Web/Admin/InStoreStat.aspx?billType=30;backup
database數(shù)據(jù)庫名 to disk=’c:inetpubwwwroot1.db’;——
在(3)中可以得到數(shù)據(jù)庫名,加上某些IIS出錯暴露出的絕對路徑,將數(shù)據(jù)庫備份到Web目錄下面,再用HTTP把整個數(shù)據(jù)庫就完完整整地下載回來,所有的管理員及用戶密碼都一覽無佘。
從以上幾點可以看出,SQL注入攻擊對我們系統(tǒng)的危害有多大。許多網(wǎng)站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中本身的變量處理不當,使應(yīng)用程序存在安全隱患。這樣,用戶就可以提交一段數(shù)據(jù)庫查詢的代碼,根據(jù)程序返回的結(jié)果,獲得一些敏感的信息或者控制整個服務(wù)器,于是SQL注入就發(fā)生了。因此數(shù)據(jù)庫管理員應(yīng)養(yǎng)成查看IIS日志的習(xí)慣,對程序過濾嚴格審查,認真檢查參數(shù),防止SQL注入攻擊的發(fā)生。
[1]戚建妙.SQL注入攻擊與數(shù)據(jù)庫安全[J].有線電視技術(shù),2004,(23).
TN
A
1673-0046(2010)11-0173-02