資源描述:
《如何保證sql server免遭sql注入攻擊?--》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、如何保證SQLServer免遭SQL注入攻擊?>> SQL注入攻擊可能是黑客攻擊面向互聯(lián)網(wǎng)的SQLServer數(shù)據(jù)庫(kù)最常用的方式。任何使用動(dòng)態(tài)SQL、允許未經(jīng)檢驗(yàn)的用戶(hù)輸入提交到數(shù)據(jù)庫(kù)的應(yīng)用程序都面臨SQL注入攻擊的風(fēng)險(xiǎn),無(wú)論你的網(wǎng)絡(luò)有多安全,或者你安裝了多少防火墻。最近有一項(xiàng)關(guān)于dash;也可能沒(méi)有對(duì)語(yǔ)法或者轉(zhuǎn)義符進(jìn)行驗(yàn)證?! QL注入攻擊是這樣進(jìn)行的:攻擊者修改現(xiàn)有命令行,通過(guò)在字符串值內(nèi)插入一個(gè)單引號(hào),或者在數(shù)字后面添加分號(hào),在轉(zhuǎn)義符后面寫(xiě)入SQL語(yǔ)句。命令行看上去類(lèi)似這樣: execsel_CustomerDataCustomerId=47663;truncateT
2、ABLECustomer 這樣會(huì)執(zhí)行sel_CustomerData過(guò)程,然后運(yùn)行truncateTABLE命令,刪除Customer數(shù)據(jù)表的內(nèi)容。如果有ForeignKey約束這個(gè)數(shù)據(jù)表,數(shù)據(jù)庫(kù)將會(huì)返回錯(cuò)誤,向黑客提供受約束的數(shù)據(jù)表名稱(chēng)。一名聰明的黑客可以利用這個(gè)技巧,查找到數(shù)據(jù)庫(kù)里面每一個(gè)表的名稱(chēng)。然后,黑客能夠?qū)?shù)據(jù)插入你的數(shù)據(jù)庫(kù),或者從你的表中選擇數(shù)據(jù)(取決于數(shù)據(jù)庫(kù)給了應(yīng)用程序什么樣的權(quán)限)。當(dāng)黑客獲取了數(shù)據(jù)表中的數(shù)據(jù),就可以使用xp_sendmail或sp_send_dbmail向他們自己發(fā)送電子郵件。即使你已經(jīng)禁用這些過(guò)程,黑客可以輕易啟用這些過(guò)程,或者使用sp_O
3、A過(guò)程添加他們自己的過(guò)程?! ∪绾未_保SQLServer數(shù)據(jù)的安全,避免SQL注入? 有多種辦法可以保護(hù)你的數(shù)據(jù)庫(kù),避免這樣的攻擊?! ∈紫龋覀冃枰捎脭?shù)據(jù)庫(kù)安全的最佳實(shí)踐方法加固數(shù)據(jù)庫(kù)安全。這包括將數(shù)據(jù)庫(kù)的操作許可設(shè)置為最低級(jí)別(settingupthedatabasesecurityissionspossible.)。同時(shí),應(yīng)用程序不要直接訪(fǎng)問(wèn)數(shù)據(jù)表。所有對(duì)數(shù)據(jù)表的訪(fǎng)問(wèn)應(yīng)該通過(guò)存儲(chǔ)過(guò)程進(jìn)行,而且那些存儲(chǔ)過(guò)程不應(yīng)該包括任何動(dòng)態(tài)SQL?! ”苊鈱?duì)表的直接訪(fǎng)問(wèn),你可以很大地減少受攻擊的層面。但是,這并不是唯一必須做的事情。存儲(chǔ)過(guò)程也存在受到攻擊的可能性。雖然對(duì)存儲(chǔ)過(guò)程進(jìn)行攻擊需
4、要花費(fèi)更多的時(shí)間,但是,仍然有可能利用你的存儲(chǔ)過(guò)程對(duì)數(shù)據(jù)庫(kù)進(jìn)行破壞。存儲(chǔ)過(guò)程就是用來(lái)向數(shù)據(jù)庫(kù)中插入、更新和刪除數(shù)據(jù)。一個(gè)聰明的黑客可以利用你自己的存儲(chǔ)過(guò)程攻擊你?! ∵@是需要應(yīng)用開(kāi)發(fā)人員和你共同工作的方面,以確保被執(zhí)行的代碼(thecodebeingexecutedagainstthedatabase)是安全的。如果不確保應(yīng)用層的安全,防范SQL注入攻擊,其他的工作都將是徒勞的。數(shù)據(jù)只要進(jìn)入數(shù)據(jù)庫(kù),基本上不可能在數(shù)據(jù)庫(kù)內(nèi)進(jìn)行驗(yàn)證。這需要在應(yīng)用層對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證?! ?yīng)用程序與數(shù)據(jù)庫(kù)最簡(jiǎn)單配合使用的方法就是在應(yīng)用程序內(nèi)動(dòng)態(tài)生成SQL命令。下面的示例中,.代碼從前臺(tái)應(yīng)用程序中調(diào)用(po
5、pulate)v_Input變量: Dimv_ConnAsNev_cmdAsNeand v_cmd.Connection=v_Conn v_cmd.mandType=mandType.Text v_cmd.mandText=execsel_CustomerDataCustomerName=v_Input Dimv_DRAsSqlDataReader v_DR=v_cmd.executeReader v_DR.Close() v_DR=Nothing v_cmd.Dispose() v_cmd=Nothing v_Conn.Close() v_Conn=N
6、othing v_DR.Close() 如果你不在v_Input變量中對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,就相當(dāng)于為SQL注入攻擊敞開(kāi)大門(mén)。如果你對(duì)輸入不進(jìn)行驗(yàn)證,就會(huì)允許攻擊者傳入一個(gè)單引號(hào)和一個(gè)分號(hào),這樣,將告訴SQLServer結(jié)束當(dāng)前的語(yǔ)句,轉(zhuǎn)而執(zhí)行另一段sql語(yǔ)句passinasinglequote,andasemicolon,entmovingontothenextstatementinthebatch。例如像這樣的值Smith;truncatetableCustomer;declaremyV=。通過(guò)SQLServer執(zhí)行的SQL語(yǔ)句會(huì)變成:TheresultingSQLstatem
7、entexecutedagainsttheSQLServer execsel_CustomerDataCustomerName=Smith;truncatetableC12下一頁(yè)>>>>這篇文章來(lái)自..,。ustomer;declaremyV= 當(dāng)應(yīng)用程序(callingapplicationrunsthecode)運(yùn)行這段代碼的時(shí)候,將運(yùn)行存儲(chǔ)過(guò)程,然后表被清空。你需要進(jìn)行一些基本的驗(yàn)證,將變量中的任何單引號(hào)替換為兩個(gè)單引號(hào)。這樣,就可以中止SQLServer運(yùn)行刪除語(yǔ)句t