国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

如何保證SQL Server免遭SQL注入攻擊

2024-08-31 00:43:36
字體:
供稿:網(wǎng)友

SQL注入攻擊可能是黑客攻擊面向互聯(lián)網(wǎng)的SQL Server數(shù)據(jù)庫最常用的方式。任何使用動態(tài)SQL、允許未經(jīng)檢驗的用戶輸入提交到數(shù)據(jù)庫的應(yīng)用程序都面臨SQL注入攻擊的風(fēng)險,無論你的網(wǎng)絡(luò)有多安全,或者你安裝了多少防火墻。最近有一項關(guān)于Web黑客攻擊的報告顯示,SQL注入攻擊呈上升趨勢,不僅僅導(dǎo)致數(shù)據(jù)盜竊和數(shù)據(jù)丟失,而且在最近一連串的自動注入攻擊中,數(shù)據(jù)庫被破壞,向用戶提供惡意Java腳本。這種滲透導(dǎo)致Web服務(wù)器令客戶端電腦感染上其它的病毒。報告對于已經(jīng)遭到攻擊的網(wǎng)站數(shù)量統(tǒng)計不一,不過,哪怕是最低的數(shù)字都上萬。在感染的高峰期,甚至聯(lián)合國的網(wǎng)站也無法幸免。

你可能會認(rèn)為SQL Server平臺既然這么不安全,不如考慮更換平臺。但事實上,所有的數(shù)據(jù)庫平臺都受到這種攻擊的困擾。由于在主機環(huán)境中更多部署的是SQL Server,所以,針對SQL Server的攻擊也就相應(yīng)更為普遍。開發(fā)人員進(jìn)行網(wǎng)頁開發(fā)工作,他們不知道如何防范這樣的攻擊。由于這種攻擊的成功率很高,所以,在惡意軟件的社區(qū)內(nèi)頗為流行。

SQL注入攻擊是如何工作的?

容易遭受SQL注入攻擊的Web應(yīng)用程序具有以下特點:

1.你的網(wǎng)站使用動態(tài)SQL。這不是指應(yīng)用程序動態(tài)生成select或者insert語句。它是指任何代碼是動態(tài)生成的,包括應(yīng)用程序在執(zhí)行語句之前,動態(tài)生成一個存儲過程。

2.當(dāng)從客戶端應(yīng)用程序取值的時候,這些值沒有經(jīng)過驗證——也可能沒有對語法或者轉(zhuǎn)義符進(jìn)行驗證。

SQL注入攻擊是這樣進(jìn)行的:攻擊者修改現(xiàn)有命令行,通過在字符串值內(nèi)插入一個單引號,或者在數(shù)字后面添加分號,在轉(zhuǎn)義符后面寫入SQL語句。命令行看上去類似這樣:

exec sel_CustomerData @CustomerId=47663; truncate TABLE Customer

這樣會執(zhí)行sel_CustomerData過程,然后運行truncate TABLE命令,刪除Customer數(shù)據(jù)表的內(nèi)容。如果有Foreign Key約束這個數(shù)據(jù)表,數(shù)據(jù)庫將會返回錯誤,向黑客提供受約束的數(shù)據(jù)表名稱。一名聰明的黑客可以利用這個技巧,查找到數(shù)據(jù)庫里面每一個表的名稱。然后,黑客能夠?qū)?shù)據(jù)插入你的數(shù)據(jù)庫,或者從你的表中選擇數(shù)據(jù)(取決于數(shù)據(jù)庫給了應(yīng)用程序什么樣的權(quán)限)。當(dāng)黑客獲取了數(shù)據(jù)表中的數(shù)據(jù),就可以使用xp_sendmail或sp_send_dbmail向他們自己發(fā)送電子郵件。即使你已經(jīng)禁用這些過程,黑客可以輕易啟用這些過程,或者使用sp_OA過程添加他們自己的過程。

如何確保SQL Server數(shù)據(jù)的安全,避免SQL注入?

有多種辦法可以保護(hù)你的數(shù)據(jù)庫,避免這樣的攻擊。

首先,我們需要采用數(shù)據(jù)庫安全的最佳實踐方法加固數(shù)據(jù)庫安全。這包括將數(shù)據(jù)庫的操作許可設(shè)置為最低級別(setting up the database security with the lowest set of permissions possible.)。同時,應(yīng)用程序不要直接訪問數(shù)據(jù)表。所有對數(shù)據(jù)表的訪問應(yīng)該通過存儲過程進(jìn)行,而且那些存儲過程不應(yīng)該包括任何動態(tài)SQL。

避免對表的直接訪問,你可以很大地減少受攻擊的層面。但是,這并不是唯一必須做的事情。存儲過程也存在受到攻擊的可能性。雖然對存儲過程進(jìn)行攻擊需要花費更多的時間,但是,仍然有可能利用你的存儲過程對數(shù)據(jù)庫進(jìn)行破壞。存儲過程就是用來向數(shù)據(jù)庫中插入、更新和刪除數(shù)據(jù)。一個聰明的黑客可以利用你自己的存儲過程攻擊你。

這是需要應(yīng)用開發(fā)人員和你共同工作的方面,以確保被執(zhí)行的代碼(the code being executed against the database)是安全的。如果不確保應(yīng)用層的安全,防范SQL注入攻擊,其他的工作都將是徒勞的。數(shù)據(jù)只要進(jìn)入數(shù)據(jù)庫,基本上不可能在數(shù)據(jù)庫內(nèi)進(jìn)行驗證。這需要在應(yīng)用層對數(shù)據(jù)進(jìn)行驗證。

應(yīng)用程序與數(shù)據(jù)庫最簡單配合使用的方法就是在應(yīng)用程序內(nèi)動態(tài)生成SQL命令。下面的示例中,.NET代碼從前臺應(yīng)用程序中調(diào)用(populate)v_Input變量:

 …
  Dim v_Conn As New SqlConnection(p_Connectionstring)
  v_Conn.Open()
  Dim v_cmd As New SqlCommand
  v_cmd.Connection = v_Conn
  v_cmd.CommandType = CommandType.Text
  v_cmd.CommandText = "exec sel_CustomerData @CustomerName=’" & v_Input & "’"
  Dim v_DR As SqlDataReader
  v_DR = v_cmd.executeReader
  v_DR.Close()
  v_DR = Nothing
  v_cmd.Dispose()
  v_cmd = Nothing
  v_Conn.Close()
  v_Conn = Nothing
  v_DR.Close()

如果你不在v_Input變量中對數(shù)據(jù)進(jìn)行驗證,就相當(dāng)于為SQL注入攻擊敞開大門。如果你對輸入不進(jìn)行驗證,就會允許攻擊者傳入一個單引號和一個分號,這樣,將告訴SQL Server結(jié)束當(dāng)前的語句,轉(zhuǎn)而執(zhí)行另一段sql語句pass in a single quote, and a semicolon, which tells the SQL Server to end the value and the statement moving on to the next statement in the batch。例如像這樣的值“Smith ’; truncate table Customer; declare @myV =”。通過SQL Server執(zhí)行的SQL語句會變成:The resulting SQL statement executed against the SQL Server

  exec sel_CustomerData @CustomerName=’Smith’; truncate table Customer; declare @myV = ’’

當(dāng)應(yīng)用程序(calling application runs the code)運行這段代碼的時候,將運行存儲過程,然后表被清空。你需要進(jìn)行一些基本的驗證,將變量中的任何單引號替換為兩個單引號。這樣,就可以中止SQL Server運行刪除語句truncated statement,因為現(xiàn)在它是值的一部分。通過這樣的簡單變化,我們的數(shù)據(jù)庫調(diào)用現(xiàn)在就會像這樣:

exec sel_CustomerData @CustomerName=’Smith’’; truncate table Customer; declare @myV = ’’’

一種更好更安全的解決方式就是把存儲過程代碼用參數(shù)來表示。這讓.NET來處理變量的數(shù)據(jù)凈化,這樣,任何注入代碼都不會執(zhí)行。

.NET代碼從你的前臺應(yīng)用程序中調(diào)用v_Input變量。

  …
  Dim v_Conn As New SqlConnection(p_Connectionstring)
  v_Conn.Open()
  Dim v_cmd As New SqlCommand
  Dim v_Parm As New SqlParameter
  v_cmd.Connection = v_Conn
  v_cmd.CommandType = CommandType.StoredProcedure
  v_cmd.Parameters.Add("@CustomerName", SqlDbType.NVarchar, 255)
  v_cmd.Parameters.Item("@CustomerName").Direction = ParameterDirection.Input
  v_cmd.Parameters.Item("@CustomerName").Value = v_Input
  v_cmd.CommandText = "sel_CustomerData"
  Dim v_DR As SqlDataReader
  v_DR = v_cmd.executeReader
  v_DR.Close()
  v_DR = Nothing
  v_cmd.Dispose()
  v_cmd = Nothing
  v_Conn.Close()
  v_Conn = Nothing
  v_DR.Close()

如果網(wǎng)站的前臺應(yīng)用程序和后臺數(shù)據(jù)庫的安全無法正確得到全面的保障,你的系統(tǒng)和數(shù)據(jù)就很容易受到SQL注入攻擊。這些攻擊可能表面看上去沒有造成什么影響,但如果把你的所有客戶數(shù)據(jù)暴漏給攻擊者,問題就大了。破壞程度可以導(dǎo)致所有的數(shù)據(jù)被刪除,或者你的網(wǎng)站和應(yīng)用程度被用來向客戶發(fā)送病毒。短期而言,這會讓客戶的電腦受到感染。長遠(yuǎn)來看,你的公司可能會列入不安全站點名單。

注:本文中的.NET代碼僅作參考之用,未經(jīng)測試,或保證可行。我是一名DBA,不是一名.NET開發(fā)人員,所以,提供此代碼時為了介紹基本的概念,而不是作為生產(chǎn)的用途。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新化县| 徐闻县| 深州市| 汤原县| 兴安盟| 恩平市| 横峰县| 彰武县| 贡山| 徐州市| 西昌市| 江源县| 寻乌县| 忻城县| 呼伦贝尔市| 吉水县| 宝清县| 太仆寺旗| 湖州市| 东丽区| 团风县| 襄垣县| 凤山县| 屯门区| 河曲县| 南平市| 神农架林区| 平度市| 惠东县| 项城市| 双流县| 嘉禾县| 定陶县| 胶州市| 乌什县| 渝北区| 行唐县| 青龙| 德州市| 中山市| 瓮安县|