SQL Server加密與SQL注入

2021-04-12 22:08:52 字數 3600 閱讀 6666

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,他可以通過檢索來獲得全部的相應的名字。現在明白了?

獲得額外的資料

當然,對於乙個攻擊程式,儘管它不知道任何顧客的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 <>''

'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 <>''

看,那就是攻擊程式從你的資料庫獲得的第乙個雇員的名字。

';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資料,記住你在這裡所學到的知識,並利用到你的資料庫中保證你的資料不被那些黑客攻擊。

加密與SQL注入

sql server上的加密 sql server上內建了加密用來保護各種型別的敏感資料。在很多時候,這個加密對於你來說是完全透明的 當資料被儲存時候被加密,它們被使用的時候就會自動加密。在其他的情況下,你可以選擇資料是否要被加密。sql server可以加密下列這些元件 密碼 儲存過程,檢視,觸發...

SQL Server動態SQL與變數繫結

有時候動態sql需要進行變數的賦值,這個時候就需要呼叫系統的儲存過程sp executesql了。使用中還是有些注意事項,如下 字元型字段需宣告為nvarchar型別 declare strsql nvarchar 1000 value str nvarchar 254 動態sql拼接 set st...

Sql server 儲存過程加密

本方法可用於加密sql儲存過程 函式或者觸發器 使用 with encryption 選項 with encryption 子句對使用者隱藏儲存過程的文字 例子 if object id n pro encrypt test is not null drop procedure pro encryp...