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