■新疆 崔良義
隨著信息技術的不斷發展,網絡信息安全問題日益突出。本文闡述了SQL 注入對應用程序的安全隱患,最后提出了一些有效的防御措施。
SQL 注入,存在于大多數具有數據庫且帶有參數的網站中,具有隱蔽性,危害性極大等特點。攻擊者往往通過不斷嘗試尋找注入點,然后構造惡意SQL 語句,將語句發送給數據庫管理系統,從而達到非法查看或修改數據的目的。例如,假設已發現網站www.test.com/index.php?id=1 存在SQL 注入,通過order by 來猜測數據庫的字段數,當字段數等于3 時數據庫返回錯誤信息,那么,我們可以進一步查詢出數據庫的隱私信息。
顯然,SQL 注入產生的主要原因就是未經檢查的用戶輸入數據,被惡意構造成了可執行的代碼,產生了開發者預期之外的動作。因而,我們可以從以下幾方面加強預防。

圖1 采用SQL 語句預編譯和綁定變量
通過使用WAF 等專業的防護軟件系統過濾用戶輸入的非法參數。例如,union、and、insert、select、delete、update、mid、or、#等關鍵字符串的過濾,確保用戶輸入數據的合法性,這樣就可以盡可能的防御SQL注入語句的輸入。
攻擊者為了找到SQL 注入點,通常會通過輸入非法字符串來獲取服務器返回的報錯信息。如果目標Web 網站開啟了默認錯誤顯示,攻擊者就可通過查看頁面的錯誤信息推測出Web網站使用的數據庫和開發語言等重要信息。因此,程序員應關閉Webserver 錯誤提示,或自定義錯誤頁面。對于PHP頁面,可將配置文件php.ini中的display_errors 設置為Off 即可關閉錯誤提示。
例如,采用Prepared Statement 將 SQL 語句“select id,name from user where id=1”預先編譯好,即通過SQL 引擎預先進行語法分析,產生語法樹,生成執行計劃;這樣后面無論你輸入什么參數,都不會影響該SQL語句的語法結構了,執行代碼如圖1 所示。
做好數據庫賬號和權限的管理,并嚴格加密處理用戶的機密信息,防止泄露。對用戶輸入的數據進行加密處理,再跟數據庫中數據比較,從而防止被SQL注入。
SQL 注入是當前普遍使用的一種Web 攻擊手段,一旦被黑客注入成功,輕則造成非法獲取數據庫信息,重則直接篡改數據庫內容,甚至破壞程序文件造成服務器宕機,給企業帶來巨大損失。
因此,作為一名合格的程序員,應在編寫程序代碼時,嚴格做好SQL 注入防御措施,并建議企業采購專業的服務器漏洞掃描工具及WAF 等防護軟件,從而為服務器多增加一層安全防范堡壘。