軟件測試開發技術SQL Server講堂:加密與SQL注入

發表于:2009-10-14來源:作者:點擊數: 標簽:軟件測試SqlsqlSQL講堂
軟件測試 開發 技術SQL Server講堂:加密與SQL注入 SQL Server 數據庫 關鍵字: sql 今天讓我們來看看在SQL Server,加密和SQL 注入攻擊。 SQL Server上的加密 SQL Server上內置了加密用來保護各種類型的敏感數據。在很多時候,這個加密對于你來說是完全透明

軟件測試開發技術SQL Server講堂:加密與SQL注入  SQL Server數據庫

關鍵字:sql 今天讓我們來看看在SQL Server,加密和SQL 注入攻擊。

  SQL Server上的加密
 
  SQL Server上內置了加密用來保護各種類型的敏感數據。在很多時候,這個加密對于你來說是完全透明的;當數據被存儲時候被加密,它們被使用的時候就會自動加密。在其他的情況下,你可以選擇數據是否要被加密。SQL Server可以加密下列這些組件:

  ·密碼

  ·存儲過程,視圖,觸發器,用戶自定義函數,默認值,和規則。

  ·在服務器和用戶之間傳輸的數據

  密碼加密

  SQL Server自動將你分配給登陸和應用角色的密碼加密。盡管當你可以從主數據庫中直接察看系統表格而不需要密碼。你不能給對這種情況作出任何修改,事實上,你根本不能破壞它。

  定義加密

  在有些時候,如果對對象進行加密是防止將一些信息分享給他人。例如,一個存儲進程可能包含所有者的商業信息,但是這個信息不能和讓其他的人看到,即使他們公開的系統表格并可以看到對象的定義。這就是為什么SQL Server允許你在創建一個對象的時候進行加密。為了加密一個存儲進程,使用下面形式的CREAT PROCEDURE 語句:

CREATE PROCEDURE procedurename [;number]
[@parameter datatype
[VARYING][ = defaultvalue][OUTPUT]]
[, …]
[WITH RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION]
 

  我們關心的僅僅是可選的WITH參數。你可以詳細說明ARECOMPILE或者ENCRYPTION,或者你可以同時說明它們。ENCRYPTION關鍵字保護SQL Server它不被公開在進程中。結果,如果ENCRYPTION在激活的時候系統存儲進程sp_helptext就會被忽視,這個存儲進程將被存儲在用戶創建進程的文本中。如果你不想要加密,你可以使用ALTER PROCEDURE,忽略WITH ENCRYPTION子句來重新創建一個進程。

  為了能夠使用加密。用戶和服務器都應該使用TCP/IP NetworkLibraries用來連接。運行適當的Network Utility和檢查Force protocol encryption,看下表,用戶和服務器之間的連接將不會被加密。


  加密也不能完全自由。當連接確定后,要繼續其他的構造,并且用戶和服務器必須運行代碼來解釋加密和解釋的包裹。這里將需要一些開銷并且當在編譯碼的時候會使進程慢下來。如果網絡包裹在你控制范圍之外,使用這種做法是非常好的。

  加密中缺少什么?

  你可以注意到在這個列表中缺少一些被加密的東西:你表格中的數據。在你存儲數據之前,SQL Server不會提供任何內置的工具來加密你的數據。

  如果你需要保護存儲在SQL Server上的數據,我們給你兩條建議:

  第一,你可以利用GRANT 和DENY關鍵字來控制你想哪個用戶可以在SQL Server中讀取的數據。

  第二.如果你真的想對數據加密,不要設法加密碼。你可以利用被測試過的商業產品的算法。

  SQL 注入攻擊

  SQL 注入攻擊是一個常規性的攻擊,它可以允許一些不法用戶檢索你的數據,改變服務器的設置,或者在你不小心的時候黑掉你的服務器。SQL 注入攻擊不是SQL Server問題,而是不適當的程序。如果你想要運行這些程序的話,你必須明白這冒著一定的風險。

  測點定位弱點

      SQL 注入的脆弱點發生在程序開發員構造一個WHERE 子句伴隨著用戶的輸入的時候。比如,一個簡單的ASP程序允許用戶輸入一個顧客的ID然后檢索公司的全部人員的名字,如果顧客ID如果作為ASP頁面的請求串的一部分返回,那么開發員可以編寫下面的代碼獲得數據:

strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
 "Database=Northwind;Integrated Security=SSPI"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open  strConn
strQuery = "SELECT ContactName FROM Customers " & _
 “WHERE CustomerID = '" & Request.Form("CustID") & "'"
Set rstResults = cnn.Execute(strQuery)
Response.Write(rstResults.Fields("ContactName").Value)
 
  現在你知道什么地方有問題了吧?如果用戶知道一個用戶的ID,他可以通過檢索來獲得全部的相應的名字?,F在明白了?

  

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97