熱點推薦:
您现在的位置: 電腦知識網 >> 安全防毒 >> 正文

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

2022-06-13   來源: 安全防毒 

  在一般的多用戶應用系統中只有擁有正確的用戶名和密碼的用戶才能進入該系統我們通常需要編寫用戶登錄窗口來控制用戶使用該系統這裡以Visual Basic+ADO為例
  
    一漏洞的產生
  
    用於登錄的表
  
    Users(namepwd)
  
    建立一個窗體Frmlogin其上有兩個文本框TextText和兩個命令按鈕cmdokcmdexit兩個文本框分別用於讓用戶輸入用戶名和密碼兩個命令按鈕用於登錄退出
  
    定義Ado Connection對象和ADO RecordSet對象
  
    Option Explicit
  
    Dim Adocon As ADODBConnection
  
    Dim Adors As ADODBRecordset
  
    在Form_Load中進行數據庫連接
  
    Set Adocon = New ADODBConnection
  
    AdoconCursorLocation = adUseClient
  
    adoconOpen Provider=MicrosoftjetOLeDB;Data Source= && _
  
    AppPath && estmdb;
  
    cmdok中的代碼
  
    Dim sqlstr As String
  
    sqlstr = select * from usersswheresname= && TextText && _
  
     and pwd= && TextText &&
  
    Set adors = New ADODBRecordset
  
    Set Adors=AdoconExecute(sqlstr)
  
    If AdorsRecordcount> Then //或If Not AdorsEOF then
  
    
  
    MsgBox Pass //通過驗證
  
    Else
  
    
  
    MsgBox Fail //未通過驗證
  
    End if
  
  
    運行該程序看起來這樣做沒有什麼問題但是當在Text中輸入任意字符串(如)在Text中輸入a or a=a時我們來看sqlstr此時的值
  
    select * from usersswheresname= and pwd=a or a=a
  
    執行這樣一個SQL語句由於or之後的a=a為真值只要users表中有記錄則它的返回的eof值一定為False這樣就輕易地繞過了系統對於用戶和密碼的驗證
  
    這樣的問題將會出現在所有使用select * from usersswheresname= && name && and pwd= && password &&的各種系統中無論你是使用那種編程語言
  
    二漏洞的特點
  
    在網絡上以上問題尤其明顯筆者在許多網站中都發現能使用這種方式進入需要進行用戶名和密碼驗證的系統這樣的一個SQL漏洞具有如下的特點
  
    與編程語言或技術無關
  
    無論是使用VBDelphi還是ASPJSP
  
    隱蔽性
  
    現有的系統中有相當一部分存在著這個漏洞而且不易覺察
  
    危害性
  
    不需要進行用戶名或密碼的猜測即可輕易進入系統
  
    三解決漏洞的方法
  
    控制密碼中不能出現空格
  
    對密碼采用加密方式
  
    這裡要提及一點加密不能采用過於簡單的算法因為過於簡單的算法會讓人能夠構造出形如a or a=a的密文從而進入系統
  
    將用戶驗證和密碼驗證分開來做先進行用戶驗證如果用戶存在再進行密碼驗證這樣一來也能解決問題

From:http://tw.wingwit.com/Article/Security/201401/30206.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.