熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL Server講堂:加密與SQL注入

2013-11-15 14:52:47  來源: SQL Server 

  今天讓我們來看看在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 = ServerCreateObject(ADODBConnection)
cnnOpen  strConn
strQuery = SELECT ContactName FROM Customers & _
 WHERE CustomerID = & RequestForm(CustID) &
Set rstResults = cnnExecute(strQuery)
ResponseWrite(rstResultsFields(ContactName)Value)
 
  現在你知道什麼地方有問題了吧?如果用戶知道一個用戶的ID他可以通過檢索來獲得全部的相應的名字現在明白了?

  獲得額外的數據

  當然對於一個攻擊程序盡管它不知道任何顧客的ID甚至不用去猜它也可以獲得數據為了完成這個工作它將下面的文本輸入到應用程序調用顧客ID的textbox中

customer ID:
UNION ALL SELECT ContactName FROM Customers
 WHERE CustomerID <> 
 
  如果你輸入了這個代碼你將會看到返回一個詢問語句

SELECT ContactName FROM Customers
 WHERE CustomerID =
UNION ALL SELECT ContactName FROM Customers
 WHERE CustomerID <> 

  通過獲得空和非空顧客的ID並集這個查詢語句會返回數據庫中所有的相關姓名事實上這個UNION技術可以被用來獲得你數據庫中大多數信息看看這個CustomerID的值

UNION ALL SELECT FirstName + + LastName FROM
 Employees WHERE LastName <>


  它將SQL語句變成

SELECT ContactName FROM Customers
 WHERE CustomerID =
UNION ALL SELECT FirstName + + LastName FROM
 Employees WHERE LastName <>
 
  看那就是攻擊程序從你的數據庫獲得的第一個雇員的名字

  更多的攻擊程序

  如果SQL注入僅僅只有數據暴光這個弱點就已經夠糟糕的了但是實際上一個良好的攻擊程序可以通過這個弱點獲取你數據庫中所有的資料看下面這個例子

;DROP TABLE Customers;

  SQL語句變成

SELECT ContactName FROM Customers
      WHERE CustomerID =
     ; DROP TABLE Customers;

  這個分號使語句和SQL Server隔離所以這裡實際上是兩個語句第一個語句不存在的名字第二個則撤消的整個Customers表兩個—SQL Server注釋符它可以使子句不發生語法錯誤

  使用這個技術的變異一個攻擊程序可以在任何SQL語句或者存儲過程上運行通過使用xp_cmdshell擴展存儲過程一個攻擊程序同樣可以在操作系統命令下運行顯然這是一個嚴重的漏洞

  保護自己的數據庫

  現在你知道如何防范SQL注入攻擊了嗎?首先你不能在用戶輸入中構造WHERE子句你應該利用參數來使用存儲進程在最初的ASP頁面下重新寫的部分將和剛才我們在表中所看到的東西相似即使你認為在你的應用程序中沒有脆弱點你應該遵守最小特權原則使用我們建議的其他安全技術允許你的用戶僅僅訪問他們能夠訪問的在你沒有發現你數據庫脆弱點的時候只有這樣不會使你的數據庫崩潰

  最後的建議

  這就是全部的SQL Server安全系列也許你現在不是一個全面的專家但是你已經了解了很多反面下一步就是你要保護你SQL Server數據記住你在這裡所學到的知識並利用到你的數據庫中保證你的數據不被那些黑客攻擊


From:http://tw.wingwit.com/Article/program/SQLServer/201311/22483.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.