不当的SQL语句导致系统不安全

不当的SQL语句导致系统不安全,第1张

不当的SQL语句导致系统不安全,第2张

在一般的多用户应用系统中,只有拥有正确用户名和密码的用户才能进入系统。我们通常需要编写一个用户登录窗口来控制用户使用系统。这里以Visual Basic+ADO为例:

第一,漏洞的出现

登录表
Users(name,pwd)
用两个文本框Text1和Text2以及两个命令按钮cmdok和cmdexit建立了一个表单Frmlogin。两个文本框用于用户输入用户名和密码,两个命令按钮用于“登录”和“注销”。
1。定义ADO连接对象和Ado记录集对象:
Option explicit
dimadocon as adodb . Connection
dimadors as adodb . RecordSet
2 .在Form_Load中建立数据库连接:
setadocon = new adodb . connection
adocon . cursor location = aduseclient
adocon . open " provider = Microsoft . jet . oledb . 4 . 0 . 1;数据源=" && _App。Path & & " est.mdb"
Code
dimsqlstr as string in CMDOK
sqlstr = " select * from userssswhere sname = ' " & & text 1 . text & _ " andpwd = ' " & & text 2 . text & & " ' "
seta dors = new adodb . recordset
seta dors = adocon . execute(sqlstr)
IFA dors . record count > 0 then//或If Not Adors。EOF then
...
MsgBox "Pass" //通过验证
否则
...
msgbox " fail "//验证失败
End如果
运行这个程序,这样做似乎没有问题。但是当你在Text1中输入任意字符串(比如123)而在Text2中输入a '或者' a'='a时,我们来看看此时sqlstr的值:
select * from userssswhere sname = ' 123 '而pwd =' a '或者' a' =' a'
。因为or后的' a'='a '为真,所以只要users表中有记录,其eof值就一定为假,从而很容易绕过系统对用户和密码的验证。这样的问题会出现在各种使用SELECT * FROM userssswhere sname = ' " & & name & "、PWD =' "&& password && " '的系统中,不管你用的是哪种编程语言。

二、漏洞的特征

在网上,上述问题尤为明显,笔者在很多网站发现,可以使用这种方法访问需要用户名和密码验证的系统。这样的SQL漏洞具有以下特征:
1。用VB,Delphi,ASP还是JSP都和编程语言或者技术无关

2。隐蔽性
这个漏洞存在于相当多的现有系统中,不容易被发现。
3。危害性
无需猜测用户名或密码即可轻松进入系统。

三。解决漏洞的方法

1.空框不能出现在控制密码中。
2。加密密码。
这里需要提到的是,过于简单的算法是不能用于加密的,因为过于简单的算法会使人以a '或' a'='a '的形状构造密文,然后进入系统。
3。将用户身份验证与密码身份验证分开,先进行用户身份验证,如果用户存在,再进行密码身份验证,这也可以解决问题

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 不当的SQL语句导致系统不安全

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情