SQL語句因編寫不當 可能導致系統不安全

來源:互聯網
上載者:User

在一般的多使用者應用系統中,只有擁有正確的使用者名稱和密碼的使用者才能進入該系統。我們通常需要編寫使用者登入視窗來控制使用者使用該系統,這裡以Visual Basic+ADO為例:

一、漏洞的產生

用於登入的表:Users(name,pwd)。

建立一個表單Frmlogin,其上有兩個文字框Text1,Text2和兩個命令按鈕cmdok,cmdexit。兩個文字框分別用於讓使用者輸入使用者名稱和密碼,兩個命令按鈕用於“登入”和“退出”。

1、定義Ado Connection對象和ADO RecordSet對象:

以下為引用的內容:

Option Explicit

Dim Adocon As ADODB.Connection

Dim Adors As ADODB.Recordset

2、在Form_Load中進行資料庫連接:

以下為引用的內容:
Option Explicit

Dim Adocon As ADODB.Connection

Dim Adors As ADODB.Recordset

2、在Form_Load中進行資料庫連接:

Set Adocon = New ADODB.Connection

Adocon.CursorLocation = adUseClient

adocon.Open "Provider=Microsoft.jet.OLeDB.4.0.1;Data Source=" && _

App.Path && " est.mdb;"

cmdok中的代碼

以下為引用的內容:
Dim sqlstr As String

sqlstr = "select * from usersswheresname='" && Text1.Text && _

"' and pwd='" && Text2.Text && "'"

Set adors = New ADODB.Recordset

Set Adors=Adocon.Execute(sqlstr)

If Adors.Recordcount>0 Then //或If Not Adors.EOF then

....

MsgBox "Pass" //通過驗證

Else

...

MsgBox "Fail" //未通過驗證

End if

 
運行該程式,看起來這樣做沒有什麼問題,但是當在Text1中輸入任一字元串(如123),在Text2中輸入a' or 'a'='a時,我們來看sqlstr此時的值:

以下為引用的內容:
select * from usersswheresname='123' and pwd='a' or 'a'='a'
 
執行這樣一個SQL語句,由於or之後的'a'='a'為真值,只要users表中有記錄,則它的返回的eof值一定為False,這樣就輕易地繞過了系統對於使用者和密碼的驗證。

這樣的問題將會出現在所有使用select * from usersswheresname='" && name && "' and pwd='" && password &&"'的各種系統中,無論你是使用那種程式設計語言。

二、漏洞的特點

在網路上,以上問題尤其明顯,筆者在許多網站中都發現能使用這種方式進入需要進行使用者名稱和密碼驗證的系統。這樣的一個SQL漏洞具有如下的特點:

1、與程式設計語言或技術無關:無論是使用VB、Delphi還是ASP、JSP。

2、隱蔽性:現有的系統中有相當一部分存在著這個漏洞,而且不易覺察。

3、危害性:不需要進行使用者名稱或密碼的猜測即可輕易進入系統。

三、解決漏洞的方法

1、控制密碼中不能出現空格。

2、對密碼採用加密方式。

這裡要提及一點,加密不能採用過於簡單的演算法,因為過於簡單的演算法會讓人能夠構造出形如a' or 'a'='a的密文,從而進入系統。

3、將使用者驗證和密碼驗證分開來做,先進行使用者驗證,如果使用者存在,再進行密碼驗證,這樣一來也能解決問題。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。