用於登入的表
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 &&"'的各種系統中,無論你是使用那種程式語言。
二、漏洞的特點
1、與程式語言或技術無關
無論是使用vb、delphi還是asp、jsp。
2、隱蔽性
現有的系統中有相當一部分存在著這個漏洞,而且不易覺察。
3、危害性
不需要進行使用者名稱或密碼的猜測即可輕易進入系統。
三、解決漏洞的方法
1、控制密碼中不能出現空格。
2、對密碼採用加密方式。
這裡要提及一點,加密不能採用過於簡單的演算法,因為過於簡單的演算法會讓人能夠構造出形如a' or 'a'='a的密文,從而進入系統。
3、將使用者驗證和密碼驗證分開來做,先進行使用者驗證,如果使用者存在,再進行密碼驗證,這樣一來也能解決問題。
SQL注入語法型別例項
一 union union操作符 用於合併兩個或多個select 語句的結果集 注意 union內部的select語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條select語句中的列的順序必須相同。預設情況,union操作符選取不同的值。如果允許重複的值,請使用union all ...
利用hackbar進行sql注入簡單例項
這個簡單的例項是對乙個 進行sql注入,獲得管理員的賬號和密碼 目標 步驟如下 1 先猜解當前網頁的字段數 在hackbar的輸入框中輸入 order by 7 頁面顯示正常,輸入 order by 8 頁面報錯,說明欄位數為7.2 獲取資料庫的基本資訊 輸入union select 1,2,3,4...
SQL注入(三) sql注入 bugku
原理 mysql 在使用 gbk 編碼的時候,會認為兩個字元為乙個漢字,例如 aa 5c 就是乙個 漢字 前乙個 ascii碼大於 128 才能到漢字的範圍 我們在過濾 的時候,往往利用的思 路是將 轉換為 換的函式或者思路會在每一關遇到的時候介紹 因此我們在此想辦法將 前面新增的 除掉,一般有兩種...