不当编写SQL语句导致系统不安全
2006-07-27 15:29
232 查看
、漏洞的产生
用于登录的表
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还是ASP、JSP。
2、隐蔽性
现有的系统中有相当一部分存在着这个漏洞,而且不易觉察。
3、危害性
不需要进行用户名或密码的猜测即可轻易进入系统。
三、解决漏洞的方法
1、控制密码中不能出现空格。
2、对密码采用加密方式。
这里要提及一点,加密不能采用过于简单的算法,因为过于简单的算法会让人能够构造出形如a' or 'a'='a的密文,从而进入系统。
3、将用户验证和密码验证分开来做,先进行用户验证,如果用户存在,再进行密码验证,这样一来也能解决问题。
用于登录的表
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还是ASP、JSP。
2、隐蔽性
现有的系统中有相当一部分存在着这个漏洞,而且不易觉察。
3、危害性
不需要进行用户名或密码的猜测即可轻易进入系统。
三、解决漏洞的方法
1、控制密码中不能出现空格。
2、对密码采用加密方式。
这里要提及一点,加密不能采用过于简单的算法,因为过于简单的算法会让人能够构造出形如a' or 'a'='a的密文,从而进入系统。
3、将用户验证和密码验证分开来做,先进行用户验证,如果用户存在,再进行密码验证,这样一来也能解决问题。
相关文章推荐
- 不当编写SQL语句导致系统不安全
- 不当编写SQL语句导致系统不安全
- SQL语句因编写不当可能导致系统不安全
- 不当编写SQL语句导致系统不安全
- 当编写SQL语句导致系统不安全
- 不当编写SQL语句导致系统不
- 一条执行4秒的sql语句导致的系统问题 (转)
- 一个有可能导致系统慢的sql语句。
- SAP HANA sql 导致系统主服务 index server宕掉的语句
- sql语句更新时没加条件语句,导致表中数据全部更新的应对办法
- 恢复数据库报错,SQL3012C 发生系统错误(原因码 = "")。无法处理后续的 SQL 语句。 SQLSTATE=58005
- 答:SQLServer DBA 三十问之六:Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息;
- SQL语句编写规范
- 详解Java的MyBatis框架中SQL语句映射部分的编写
- 安装Vs2012后,编写Vc++程序找不到系统头文件和导致VS2010工程编译的问题
- 在JAVA 源程序中编写SQL语句时使用ORACLE 绑定变量
- 编写查询条件不区分大小写的SQL语句!
- 在编写SQL语句时应该注意的一些小问题;
- 开始使用VS2005+ASP.NET+Access(以后可能是MS SQL Server)编写管理系统的计划
- 记一次SQL语句编写不规范引起的小问题(where条件varchar自动转number)