[摘要]隨著網絡應用的發展日益突出,在各式各樣的網絡攻擊中,SQL Injection是最為常用的攻擊手段,攻擊者利用可能引發錯誤的SQL語句使網頁或程序出現異常后,獲取信息分析網站結構組成從而控制網站。存儲過程是一組編譯在單個執行計劃中的SQL 語句,存儲過程不僅能提高運行效率,也是防范SQL Injection攻擊的有效手段之一。
[關鍵詞]存儲過程 SQL Injection
Internet站點設計從以往基于靜態HTML 的技術發展到以數據庫為中心的高度交互的Web應用程序。由于數據庫的存在,攻擊者在對網站的數據庫攻擊中SQL Injection是最為常用的手法,它是利用SQL命令引發數據庫的錯誤信息的攻擊手段。本文在一定程度上能解決注入攻擊的安全問題。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,它執行效率比動態創建的SQL語句效率要高的多,這是程序員使用存儲過程首先想到的主要功能,但存儲過程對于程序安全性和對SQL Injection防范作用同樣意義重大。
一、SQL Injection原理分析
SQL Injection是在代碼中直接將未經過過濾和檢測的情況下直接引入到了SQL語句中,攻擊者只要了解程序語句、數據庫結構,就可輕易寫出帶有破壞性或其它目的的SQL語句來,從而控制整個主機。SQL Injection攻擊的方法還有很多,防止攻擊的通常方法是程序員編寫函數代碼嚴格過濾產生執行異常或邏輯錯誤的字符,但攻擊者SQL Injection規避入侵檢測的技術也花樣翻新,攻擊者運用編碼技術繞過ASCII編碼,如or 1=1可以用%6f%72%20%31%3d%31代替,對于防范此類攻擊會增加難度,同時程序執行效率也會降低并影響到一些正常的內容輸入。
二、存儲過程概述
存儲過程是一組編譯在單個執行計劃中的 Transact-SQL 語句,存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲并作為一個單元處理。存儲過程存儲在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其它強大的編程功能。在一個存儲過程內,可以設計、編碼和測試執行某個常用任務所需的 SQL 語句和邏輯,之后每個需要執行該任務的應用程序只須執行此存儲過程即可。如果某操作需要大量 Transact-SQL 代碼或需重復執行,存儲過程將比 Transact-SQL 批代碼的執行要快。一個需要數百行 Transact-SQL 代碼的操作由一條執行過程代碼的單獨語句就可實現,而不需要在網絡中發送數百行代碼。
三、存儲過程安全防范應用
以身份驗證頁面為例,在SQL Server2000中編寫存儲過程:
CREATE PROCEDURE da_login @username varchar(16),@password varchar(50) AS
SET NOCOUNT ON
SELECT* FROM users WHERE username=@username and password=@password
GO
該存儲過程包含兩個輸入參數@username和@password,數據類型為varchar,設用戶提交的username為李四’--,password為321。如果不用存儲過程,驗證SQL語句為:select * from users where username=’李四’--‘and password=’321’,密碼后面語句被解釋為注釋語句,這樣只對用戶名進行驗證,而不對密碼進行驗證。存儲過程參數用于在存儲過程和調用存儲過程的應用程序或工具之間交換數據:輸入參數允許調用方將數據值傳遞到存儲過程,輸出參數允許存儲過程將數據值或游標變量傳遞回調用方,他們被預先作為獨立的數據體與SQL語句交互,上例使用da_login存儲過程驗證:李四’--,作為一個標準varchar的字符串傳遞給參數@username,即username的值為李四’--;321作為一個標準varchar的字符串傳遞給參數@password,即password的值為321,兩個參數之間不會進行字符串重組,即存儲過程里的SQL查詢語句不會組合為select * from users where username=’李四’- -‘and password=’321’,因而da_login存儲過程驗證是對用戶名和密碼的完整性驗證,是有效地身份驗證,在高效能訪問數據庫的同時,解決了SQL Injection攻擊。
四、結論
在編寫帶有數據庫的Web應用程序中,使用存儲過程能極大地提高程序執行效率,利用存儲過程中參數的整體一致性,將用戶交互的數據作為參數傳遞給存儲過程中的Transact-SQL語句,不會導致語句執行異常,不僅擴展了數據錄入內容的范圍、減少了代碼編寫的難度,也可有效地防止SQL注入攻擊帶來的危害。在應用程序中使用存儲過程并且配合完善的錯誤捕獲功能,可以開發出高效健壯的網絡應用程序,減少攻擊帶來的損失,保證網絡服務持續有效地運行。
參考文獻:
[1]羅曉沛,侯炳輝.系統分析師教程[M].北京:清華大學出版社,2003
[2]張友生,徐鋒.系統分析師技術指南[M].北京:清華大學出版社,2004
[3]李建忠.Microsoft .NET框架程序設計[M].北京:清華大學出版社,2003
[4]桂思強.ASP.net與數據庫程序設計[M].北京:中國鐵道出版社,2002
[5]微軟公司.ASP.NET安全應用程序開發[M]. 北京:清華大學出版社,2003