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

2021-04-08 19:25:41 字數 1679 閱讀 5320

、漏洞的產生

用於登入的表

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中進行資料庫連線:

set adocon = new adodb.connection

adocon.cursorlocation = aduseclient

adocon.open "provider=microsoft.jet.oledb.4.0.1;data source=" && _

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、將使用者驗證和密碼驗證分開來做,先進行使用者驗證,如果使用者存在,再進行密碼驗證,這樣一來也能解決問題。

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

在一般的多使用者應用系統中,只有擁有正確的使用者名稱和密碼的使用者才能進入該系統。我們通常需要編寫使用者登入視窗來控制使用者使用該系統,這裡以visual basic ado為例 一 漏洞的產生 用於登入的表 users name,pwd 建立乙個窗體frmlogin,其上有兩個文字框text1,t...

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

在一般的多使用者應用系統中,只有擁有正確的使用者名稱和密碼的使用者才能進入該系統。我們通常需要編寫使用者登入視窗來控制使用者使用該系統,這裡以visualbasic ado為例 一 漏洞的產生 用於登入的表 users name,pwd 建立乙個窗體frmlogin,其上有兩個文字框text1,te...

Where語句設定不當導致索引失效

雖然說索引在使用上可能有種種限制,但是還是在資料庫設計中被充分利用。因為在大部分情況下索引還是被用來提高資料庫效能的乙個工具。不過有些資料庫工程師往往會犯一些低階的錯誤,導致索引失效。如在where條件子句中設定了不合適的條件,從而在查詢等操作時導致原先在表中設定的索引不起作用。筆者以前也多次犯過類...