国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:11:39
字體:
來源:轉載
供稿:網友
在一般的多用戶應用系統中,只有擁有正確的用戶名和密碼的用戶才能進入該系統。我們通常需要編寫用戶登錄窗口來控制用戶使用該系統,這里以visual basic+ado為例:

  一、漏洞的產生

  用于登錄的表

  users(name,pwd)

  建立一個窗體frmlogin,其上有兩個文本框text1,text2和兩個命令按鈕cmdok,cmdexit。兩個文本框分別用于讓用戶輸入用戶名和密碼,兩個命令按鈕用于“登錄”和“退出”。

  1、定義ado connection對象和ado recordset對象:

option explicitdim adocon as adodb.connectiondim adors as adodb.recordset


  2、在form_load中進行數據庫連接:

set adocon = new adodb.connectionadocon.cursorlocation = aduseclientadocon.open "provider=microsoft.jet.oledb.4.0.1;data source=" && _app.path && " est.mdb;" cmdok中的代碼dim sqlstr as stringsqlstr = "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、將用戶驗證和密碼驗證分開來做,先進行用戶驗證,如果用戶存在,再進行密碼驗證,這樣一來也能解決問題。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝山区| 石河子市| 卓尼县| 恩施市| 彭山县| 肇庆市| 巢湖市| 随州市| 聂荣县| 塔城市| 集贤县| 桐柏县| 合水县| 晋州市| 乌审旗| 沐川县| 容城县| 大厂| 涪陵区| 武宣县| 灯塔市| 长兴县| 肇州县| 连州市| 澄城县| 洪江市| 扎兰屯市| 新民市| 明溪县| 四川省| 同心县| 长治市| 巴彦淖尔市| 临洮县| 茂名市| 定州市| 荣成市| 元江| 通河县| 桂阳县| 邢台市|