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