VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

[推薦]不當編寫SQL語句導致系統不安全

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> SQL 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期六 二月 14, 2004 1:06 pm    文章主題: [推薦]不當編寫SQL語句導致系統不安全 引言回覆

在一般的多用戶應用系統中,只有擁有正確的用戶名和密碼的用戶才能進入該系統。我們通常需要編寫用戶登錄視窗來控制用戶使用該系統,這堨HVisual 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中進行資料庫連接:
  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、VFP還是ASP、JSP。
  2、隱蔽性
  現有的系統中有相當一部分存在著這個漏洞,而且不易覺察。
  3、危害性
  不需要進行用戶名或密碼的猜測即可輕易進入系統。
  三、解決漏洞的方法
  1、控制密碼中不能出現空格。
  2、對密碼採用加密方式。
  這堶n提及一點,加密不能採用過於簡單的演算法,因為過於簡單的演算法會讓人能夠構造出形如a' or 'a'='a的密文,從而進入系統。
  3、將用戶驗證和密碼驗證分開來做,先進行用戶驗證,如果用戶存在,再進行密碼驗證,這樣一來也能解決問題。

_________________
#############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!

學會VFP使用者社區的搜尋,Code才會更有趣~
#############################
回頂端
檢視會員個人資料 發送私人訊息
summer



註冊時間: 2003-06-19
文章: 32


第 2 樓

發表發表於: 星期三 二月 25, 2004 7:44 pm    文章主題: 引言回覆

Cool
這個問題真是個好問題
我大約在四年前發現這問題,因此我查閱了SQL server與Windows NT的使用者帳號可否使用如樓主所提的這些可供入侵的非法字元,所幸這些字元皆無法成為登入者帳號的一部份,因此,我在所有要登入的劃面裡,全面使用一個偵測的 Class,把可能的問題字元全部先行偵測,在沒有問題後,再送往後端執行驗證,以確保非法使用者跳過安全驗證這一關.....

這個方法我在 C# 也使用,效果也是一樣釨...

註:
 在此提供非法登入者可能使用的字元及字元組供大家參考
 『 -- 』、『 '= 』、『 /* 』、『 */ 』、『 1=1 』、『 1=0 』、『 '=' 』、『 ' 』
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> SQL 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作