運用LINQ輕松清除SQL注入式攻擊
微軟的LINQ to SQL技術為.net開發人員提供了一種機會,使其可以清除所開發的Web應用程序中SQL注入式安全漏洞的可能性。
隨著對Web安全破壞的與日俱增,開發人員越來越深刻地認識到需要為其開發的應用程序的安全性承擔更大的責任,而且應用程序框架的廠商們也將更堅實的安全特性構建到其應用軟件中去。許多開發人員已經認識到構建安全應用程序和防止破壞性攻擊的 有效的方法就是從一開始就要安全地設計和實施應用程序。不幸的是,開發團隊往往缺乏訓練和資源來做出關于應用程序安全的科學設計決策。
在開發人員承受越來越多的安全責任之時,許多開發人員了解到的第一個Web應用安全漏洞,是一個被稱為“SQL注入”的極危險的命令注入形式。命令注入的原始的形式本是指這樣一種漏洞:攻擊者通過提供一個正常使用者意料之外的輸入,改變你的Web應用程序的運行方式,從而允許攻擊者運行服務器上的非授權的命令。無疑,SQL注入式攻擊是很常見的、被廣泛使用的攻擊形式。幸運的是,一旦我們理解了這個問題,就可以很容易地防止SQL注入式攻擊。更妙的是,現在微軟的數據訪問技術向.net開發人員提供了徹底地清除SQL注入漏洞的機會,當然前提是能夠正確使用。這種技術稱為“語言級集成查詢”(Language Integrated Query (LINQ)),并隨Visual Studio "Orcas" 和 .NET Framework 3.5一起發布。本文將討論如何通過LINQ強化Web應用程序的數據訪問代碼,從而解決通過SQL注入進行攻擊的問題。
概述
SQL注入是一種Web應用程序的安全漏洞,通過它攻擊者可以將惡意數據提交給應用程序,欺騙應用程序在服務器上執行惡意的SQL命令。理論上講,這種攻擊是容易預防的,不過由于其允許攻擊者直接運行針對用戶關鍵數據的數據庫命令,從而成為一種常見的、危害性大的攻擊形式。在非常極端的情況下,攻擊者不但能夠自由地控制用戶的數據,還可以刪除數據表和數據庫,甚至控制整個數據庫服務器。
如果這種攻擊容易預防,那么為什么還如此危險呢?首先,由于眾所周知的經濟上的原因,你的應用數據庫是非常誘人的,可以引起攻擊者的極大注意。如果SQL注入漏洞在Web應用程序中可能存在著,那么對于一個攻擊者來說是很容易檢測到的,然后就可以利用它。很顯然,即使SQL注入錯誤并不是開發人員 經常犯的錯誤,它們也很容易被發現和利用。
檢測SQL注入漏洞的一個簡單方法是在一次輸入中插入一個元字符(meta-character),一個應用程序會用這個字符生成一個數據庫訪問語句。例如,在任何包含一個搜索輸入欄的Web站點上,一個攻擊者可以輸入一個數據庫元字符,例如一個核對符號(),然后單擊“搜索”按鈕提交輸入。如果應用程序返回一個數據庫錯誤消息,攻擊者不但會知道他已經發現了一個應用程序的數據庫驅動部分,而且他還能注入更加有意義的命令,讓你的服務器執行它們。應用程序安全研究員Michael Sutton近來強調,發現那些易于受到SQL攻擊的站點是很容易的。他說,使用Google搜索API這種方法只需幾分鐘就可以確定大量的潛在的易受攻擊的站點。
對SQL注入的剖析
這里我們給出一個SQL注入的例子來說明兩個問題,一是SQL注入這種錯誤是很容易犯的,二是只要進行嚴格的程序設計,這種錯誤是很容易預防的。
這個示例用的Web應用程序包含一個名為SQLInjection.aspx簡單的客戶搜索頁面,這個頁面易于受到SQL注入攻擊。此頁面包含一個CompanyName的輸入服務器控件,還有一個數據表格控件,用于顯示從微軟的示例數據庫Northwind的搜索結果(這個數據庫可從SQL Server 2005中找到)。在搜索期間執行的這個查詢包含一個應用程序設計中很普通的錯誤:它動態地從用戶提供的輸入中生成查詢。這是Web應用程序數據訪問中的一個主要的錯誤,因為這樣實際上潛在地相信了用戶輸入,并直接將其發送給你的服務器。在從“搜索”的單擊事件啟動時,這個查詢看起來是這個樣子: