这个sql语句错在哪里?(50分)

  • 主题发起人 主题发起人 longpoet
  • 开始时间 开始时间
你将语句写成如下:
sqlstring:='select * from password where username=:user and password=:pass'
with query1 do
begin
close;
sql.clear;
sql.add(sqlstring);
params[0].asstring:=Trim(Edit1.Text);
params[1].asstring:=Trim(Edit2.Text);
prapare;
open;
end;
 
weekboy
must right
 
照dopro的方法写吧
 
Sql语句密码验证安全漏洞

来源网站: WWW.Gmwz.NET 广明网站
发布时间: 2002-4-24 12:47:31
浏览次数: 17 次

 Sql语句作为国际标准的数据库查询语句,在各种编程环境中得到了广泛的应用。作为一个成熟、稳定的系统,用户登陆和密码验证是必不可少的。笔者在平时的编程工作中发现,许多程序员在用sql语句进行用户密码验证时是通过一个类似这样的语句来实现的:

  Sql="Select * from 用户表 where 姓名='"+name+"' and 密码='"+password+"'"

  其中name和password是存放用户输入的用户名和口令,通过执行上述语句来验证用户和密码是否合法有效。但是通过分析可以发现,上述语句却存在着致命的漏洞。当我们在用户名称中输入下面的字符串时:111'or'1=1,然后口令随便输入,我们设为aaaa。变量代换后,sql语句就变成了下面的字符串:

  Sql="Select * from 用户表 where 姓名='111'or'1=1' and 密码='aaaa'

  我们都知道select语句在判断查询条件时,遇到或(or)操作就会忽略下面的与(and)操作,而在上面的语句中1=1的值永远为true,这意味着无论在密码中输入什么值,均能通过上述的密码验证!这个问题的解决很简单,方法也很多,最常用的是在执行验证之前,对用户输入的用户和密码进行合法性判断,不允许输入单引号、等号等特殊字符。

  上述问题虽然看起来简单,但确实是存在的。例如在互联网上很有名气的网络游戏"笑傲江湖"的早期版本就存在着这样的问题,笔者也是在看了有关此游戏的漏洞报告后才仔细分析了自己以前编写的一些程序,竟然有不少也存在着这样的漏洞。这确实应该引起我们的注意。这也暴露出包括笔者在内的年轻程序员在编程经验和安全意识上的不足。同时也提醒我们编程工作者在程序设计时应当充分考虑程序的安全性,不可有半点马虎,一个看似很小的疏漏可能就会造成很严重的后果。
 
user:=Trim(Edit1.Text);
pass:=Trim(Edit2.Text);
sqlstring:='select * from password where (username='''+user+''') and (password='''+pass+''')';
不要:和“,这样试试看行不行
之所以说3个单引号代表一个,是因为最两边的那两个代表引号(用来标志是字符串),中间的那一个代表被标志出来的字符。
 
谢谢大家,我已经找到方法了!原来真是三个单括号就可以了!!![:D]

谢谢大家了!!!
 
万分感谢大家几天来的回复,没想到一个登录竟然会引发如此多的问题。虽然问题已经解决,但是我想把
这些天来的一些感想写出来,让大家知道,也不枉费这么多人浏览,这么多人回复。

首先,为了找到相关解释,我几乎翻遍了手边所有的delphi书,看字符串、看tedit、看sql、看ado。但
我发现它们对这个问题都是浅尝辄止,就算是有相应的例子,如法炮制,也是错的。或许它是对的,但是和我
的条件不一样,但著书者是不是应该把这么普遍的问题考虑周全呢?所以,我首先感到的是对书的失望:(

然后,我来到论坛,两分钟之内就有人回复,四天内24回复,各种各样的解决方法,让我感到惊喜。惊喜
之余,我在想,真正需要的是不是一个标准,让所有的事情有章可循?为什么会这样的情况:一个单括号也行
,三个也行,四个也行,还有双引号也行,为什么还要分什么sql、access、bde、ado?难道不可以有一个统
一的标准让大家遵循吗?所以,接下来的是对标准的失望:(

在这里,我要感谢一些人
xianjun:你从一开始就写出了三个,我也试了,可惜加了个:
SS2000: 你对:的解释让我开始怀疑我的书。
小小K: 首先要谢谢你贴的文章,看了后我觉得自己又走了一步,你的参数方法我也试了,好用,谢谢

zhongtu:呵呵,开阔眼界,很另类。
dopro: 谢谢你的代码,可是……
yydreamer:你的解释是一锤定音的。

最后,很遗憾,我当初给的分太少了,让我现在很是为难,以此贴让我学到的东西,500分也不够啊!还
是要谢谢大家!

 
也许我只好说我当然的回复只是简单了点的,//因为用不够字符串写的SQL语句.
也非常感谢你把问题解决了之后,能够给大家
一些提示,谢谢.
 
建议大家使用QuotedStr function,头就不会这么晕了
 
什么东东?
 
后退
顶部