CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

如何避免username和password为1' or '1'='1这样的万能帐户登陆系统?

楼主for123()2004-08-02 21:32:07 在 Web 开发 / ASP 提问

username=request("username")  
  password=request("password")  
  username="'"&username&"'"  
  password="'"   &   password   &   "'"  
  sql="select   *   from   testtable   where   username="   &   username   &   "   and   password="   &   password  
   
  请问如何改进上述代码避免出现    
  username和password为1'   or   '1'='1这样的万能帐户登陆系统?  
  问题点数:0、回复次数:51Top

1 楼lordwudee(三屉馒头)回复于 2004-08-02 21:38:45 得分 0

sql="select   *   from   testtable   where   username="   &   username  
  rs.open   sql,conn,3,3  
  if   rs.eof   or   rs.bof   then  
  ...  
  else    
        if   rs("password")<>password   then  
        ...  
        else  
        ...  
        end   if  
  end   if  
  先判断用户名,再判断密码Top

2 楼bdb(蓝色多瑙河)回复于 2004-08-02 21:39:44 得分 0

用判断InStr()函数来判断,  
  其它的输入框用replace(trim(request("")),"';","")把英文的单引号和分号转换为空来过滤。Top

3 楼weige250(桂电weige)回复于 2004-08-02 21:41:31 得分 0

算是sql注入攻击吧Top

4 楼left_tomorrow(中间件)回复于 2004-08-02 21:47:29 得分 0

'*******************************************************************  
        '   检查sql字符串中是否有单引号,有则进行转化  
        '*******************************************************************  
        function   CheckStr(str)  
                dim   tstr,l,i,ch  
                    str   =   Trim(str)  
          l=len(str)  
          for   i=1   to   l  
                  ch=mid(str,i,1)  
                  if   ch="'"   then  
                  tstr=tstr+"'"  
            end   if  
            tstr=tstr+ch  
          next  
          CheckStr=tstr  
        end   function  
  Top

5 楼lordwudee(三屉馒头)回复于 2004-08-02 21:49:44 得分 0

嘿嘿,其实不用那么复杂,只要向我那样判断两层就没问题了,过得了第一层它不可能再过第二层Top

6 楼jkjt(如何)回复于 2004-08-02 21:53:29 得分 0

去掉空格就好了Top

7 楼mjpclab(有只大猫猫 mjpclab.net)回复于 2004-08-02 23:28:40 得分 0

username="'"&   replace(username,"'","''")   &"'"Top

8 楼IStephen(风的自由)回复于 2004-08-02 23:34:22 得分 0

判断两次,先判断用户名,再判断密码,就如   lordwudee(三屉馒头)   所讲Top

9 楼AAsx(arbiter)回复于 2004-08-03 00:11:01 得分 0

username=request("username")  
  password=request("password")  
   
  sql="select   *   from   testtable   where   username='"   &   username   &   "'"  
  rs.open   sql,conn,0,1  
   
  if   not(rs.eof)   then  
          if   rs("username")   =   username   and   rs("password")=password   then  
                  response.write   "成功登录"  
          else  
                  response.write   "非法登录!"  
                  response.write   "<br>正在格式化您的硬盘..."  
          end   if  
  else  
          response.write   "没有该用户"  
  end   if  
   
  请问如何改进上述代码避免出现    
  username和password为1'   or   '1'='1这样的万能帐户登陆系统?Top

10 楼AAsx(arbiter)回复于 2004-08-03 00:11:21 得分 0

username=request("username")  
  password=request("password")  
   
  sql="select   *   from   testtable   where   username='"   &   username   &   "'"  
  rs.open   sql,conn,0,1  
   
  if   not(rs.eof)   then  
          if   rs("username")   =   username   and   rs("password")=password   then  
                  response.write   "成功登录"  
          else  
                  response.write   "非法登录!"  
                  response.write   "<br>正在格式化您的硬盘..."  
          end   if  
  else  
          response.write   "没有该用户"  
  end   if  
   
  Top

11 楼AAsx(arbiter)回复于 2004-08-03 00:12:14 得分 0

username=request("username")  
  password=request("password")  
   
  sql="select   *   from   testtable   where   username='"   &   username   &   "'"  
  rs.open   sql,conn,0,1  
   
  if   not(rs.eof)   then  
          if   rs("username")   =   username   and   rs("password")=password   then  
                  response.write   "成功登录"  
          else  
                  response.write   "用户名或密码有错"  
          end   if  
  else  
          response.write   "没有该用户"  
  end   ifTop

12 楼wubaozhang()回复于 2004-08-03 01:42:18 得分 0

基本漏洞而已  
  在提取表单元素的时候至少要有个过滤把,象'   、%、;、"、#、$什么的都得替换掉,我一般是替换成全角中文字符的Top

13 楼qhyan23(yan)回复于 2004-08-03 07:59:22 得分 0

这么多的好代码呀!  
  我通同收藏了.Top

14 楼QQgenie(妖魔鬼怪)回复于 2004-08-03 08:04:17 得分 0

去掉空格还会有问题吗!Top

15 楼BainStudio(胖胖狗)回复于 2004-08-03 08:14:25 得分 0

方法一:把输入字符串的引号给转换掉或屏蔽掉.  
  方法二:先通过username来查询记录在通过userpass来匹配帐号.Top

16 楼s1ihome(My hometown is a beautiful village)回复于 2004-08-03 08:18:04 得分 0

呵呵,都不错,多多学习了:)Top

17 楼19az(相信我,没错的!)回复于 2004-08-03 08:21:52 得分 0

对用户名和密码进行校验就可以了,不允许出现单引号Top

18 楼bxjgood66(累并快乐着!真想...^-^)回复于 2004-08-03 08:30:46 得分 0

哈哈     大家都说了哟Top

19 楼cesheng(易拉罐)回复于 2004-08-03 08:35:41 得分 0

function   Check(str)  
  str=replace(str,"","")  
  str=replace(str,"=","")  
  str=replace(str,";","")  
  str=replace(str,">","")  
  str=replace(str,"<","")  
  str=replace(str,"%","")  
  str=replace(str,"'","")  
  Check=str  
  end   functionTop

20 楼bluemoon0001(小天--追梦浪子)回复于 2004-08-03 08:44:29 得分 0

防止SQL注入的函数:  
  Function   SafeRequest(ParaName,ParaType)  
  '---   传入参数   ---  
  'ParaName:参数名称-字符型  
  'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)  
   
  Dim   ParaValue  
  ParaValue=Request(ParaName)  
      If   ParaType="1"   then  
           
          If     ParaValue<>""   and   isNumeric(ParaValue)=false   then  
                Response.write   "参数"   &   ParaName   &   "必须为数字型!"  
                Response.end  
          End   if  
      Else  
          ParaValue=replace(ParaValue,"'","&acute;")  
      End   if  
      SafeRequest=ParaValue  
  End   function  
   
  做两次判断:  
  username=saferequest("username","2")  
  password=saferequest("password","2")  
  sql="select   *   from   testtable   where   username="   &   username  
  rs.open   sql,conn,3,3  
  if   rs.eof   or   rs.bof   then  
  ...  
  else    
        if   rs("password")<>password   then  
        ...  
        else  
        ...  
        end   if  
  end   if  
  Top

21 楼ycted(长城万里今犹在,不见当年秦始皇!)回复于 2004-08-03 08:47:53 得分 0

username   =   trim(replace(replace(Request.form("username"),"'","''"),chr(255),""))Top

22 楼kebeixueng(脱变的蚕)回复于 2004-08-03 08:51:14 得分 0

两次判断就可以了,不用这么复杂Top

23 楼aiguo25(青春无悔)回复于 2004-08-03 09:13:24 得分 0

必须将单引号过滤,否则网页将出现查询性错误  
  replace(trim(request("")),"';","")  
  然后出现的错误将被检测出来  
  Top

24 楼colinliu(流浪人)回复于 2004-08-03 09:17:14 得分 0

sql="select   *   from   testtable   where   username="   &   username  
  rs.open   sql,conn,3,3  
  if   rs.eof   or   rs.bof   then  
  ...  
  else    
        if   rs("password")<>password   then  
        ...  
        else  
        ...  
        end   if  
  end   if  
  先判断用户名,再判断密码  
   
  Top

25 楼BlueDestiny(Design Life - never-online.net)回复于 2004-08-03 09:21:59 得分 0

拿凳子来学习学习~Top

26 楼rehearts(闪闪红心)回复于 2004-08-03 09:22:47 得分 0

不能只判断是否rs.eof,如果是rs.eof不足以说明用户已经合法的登陆,还必须于rs("username")=username,rs("password")=password,这样就即使他通过sql语句注入,也不行了Top

27 楼jervis82(我是海绵.吸.吸.吸...)回复于 2004-08-03 09:36:10 得分 0

看不明白为什么他叫做万能用户,  
  有人解释吗  
  用户名不是都在控制注册时搞定了吗  
  一般都不含有非法字符吧。  
  我一般在登陆中的都只是先判断一下用户是否存在,再判断密码是否正确那样,  
  这也会有问题吗?Top

28 楼jervis82(我是海绵.吸.吸.吸...)回复于 2004-08-03 09:38:25 得分 0

如果用上rs("username")=username  
  rs("userpass")=userpass  
  的话应该还是会比较安全吧。其它的都想不到了。Top

29 楼yangyanli(乌托邦主·蛤蟆)回复于 2004-08-03 09:53:55 得分 0

http://community.csdn.net/Expert/topic/3230/3230236.xml?temp=.4624903Top

30 楼wjhcjg(任任行)回复于 2004-08-03 09:59:53 得分 0

username="'"&   replace(username,"'","''")   &"'"  
  Top

31 楼wjhcjg(任任行)回复于 2004-08-03 10:04:57 得分 0

可写成:  
  sql="select   *   from   testtable   where   username="'"&   replace(username,"'","''")   &"'"   and   password="'"&   replace(password,"'","''")   &"'"  
   
  当然最后不要这种写法(有一条SQL语句来把关),人家还是有漏洞的,   lordwudee(三屉馒头)兄写的是较实用的,为什么呢,即使用上面我写的把'换成''了,人家可以用你同一表的其它字段去绕过,如你同一表有sex,则人家可以再能过1'   or   sex<>'1   ,呵呵,当然这是猜的字段。没猜中顶多出错,猜中了呵呵,不得了了哦Top

32 楼TSD(智之选,商欲达--智商购物系统zhishop.com)回复于 2004-08-03 10:10:06 得分 0

用REPLACE过滤掉标点符号和SQL关健字Top

33 楼valu(V6bbs Ver1.4发布(仿西祠xici):www.v6bbs.com)回复于 2004-08-03 10:14:01 得分 0

<%  
  username=Chk(request("username"))  
  password=Chk(request("password"))  
   
  Function   Chk(str)  
          If   str<>""   Then   Chk=Replace(str,"'","&#39;")  
  End   Function  
  %>Top

34 楼look4sword(觅剑 | 劈柴、喂马、周游世界。)回复于 2004-08-03 10:16:14 得分 0

replace掉所有26个字母10个数字和下划线外的字符.Top

35 楼ltjy(快乐人生)回复于 2004-08-03 10:20:16 得分 0

做两层判断是最好的Top

36 楼goshowk()回复于 2004-08-03 12:29:23 得分 0

其实只要在数据库中保存加密后的密码,在登陆时将输入的密码加密和数据库中的该用户的密码比较就可以避免这样问题。Top

37 楼blackxxx(black)回复于 2004-08-03 12:37:21 得分 0

同意2层验证,以上方法我都试了Top

38 楼boywind(做个 成功 自信 快乐 的自己``````)回复于 2004-08-03 13:32:19 得分 0

1,注册时,就屏蔽特殊字符。  
  2,登陆时,屏蔽字符。  
  3,登陆时,用两层验证。  
  4,对用户密码进行加密,比如用MD5加密,用加密后的新密码进行验证Top

39 楼jzywh(江大鱼)回复于 2004-08-03 14:33:04 得分 0

分布判断  
   
  先判断用户名是否存在  
   
  在检查用户名是否相符  
   
  屏蔽字符串  
   
  屏蔽一些在sql中不安全的字符串  
   
   
  md5加密  
   
  密码用md5加密  
   
  用户名最好也用md5加密  
  Top

40 楼wenky_2000()回复于 2004-08-03 14:35:30 得分 0

markTop

41 楼QinMuBiao(秦慕飙)回复于 2004-08-03 17:06:02 得分 0

关注Top

42 楼mackyliu(才子-54caizi.com)回复于 2004-08-03 17:20:01 得分 0

过滤单引号和空格,我指的空格包括半角和全角空格,Tab的缩进空格和Chr(255),最后还有/**/  
  别问我为什么这样过滤,照做就一切搞定,至于一些SQL关键字,过滤是非常不合理的。Top

43 楼sxsgssgs(.net新手)回复于 2004-08-03 17:22:29 得分 0

来高手呀。Top

44 楼conceitblue(蓝色幻想)回复于 2004-08-03 17:27:36 得分 0

你都用md5加密估计就没问题了     注册的时候   验证的时候   都加密     其他的什么都不用了   呵呵   绝对没问题Top

45 楼opparts()回复于 2004-08-03 17:27:51 得分 0

 
      去网络上下一个JAVA的版本的MD5的算法,  
    把密码加密下,然后验证的时候,就没有这种问题,  
  非常简单.超级推荐!  
  Top

46 楼valu(V6bbs Ver1.4发布(仿西祠xici):www.v6bbs.com)回复于 2004-10-21 13:18:15 得分 0

用户也用md5加密?我没听错吧?Top

47 楼manyou(他山之石【养万头猪,行万里路】)回复于 2004-10-21 13:23:24 得分 0

后门法:  
  uid     =   replace(uid,"::","or")  
  upwd   =   replace(upwd,"::","or")Top

48 楼manyou(他山之石【养万头猪,行万里路】)回复于 2004-10-21 13:23:59 得分 0

后门只为自己开,哈哈Top

49 楼nan7757(骑着蚂蚁闯红灯)回复于 2004-10-21 13:31:25 得分 0

强~!!!!Top

50 楼chenwqiang(..^_^)回复于 2004-10-21 13:35:20 得分 0

分开判断是一个好方法Top

51 楼TSD(智之选,商欲达--智商购物系统zhishop.com)回复于 2004-10-21 13:37:06 得分 0

写个函数过滤掉SQL的关健词和一些符号就可以了Top

相关问题

  • WIN XP用户帐户的密码忘了,如何破解,有没有万能密码?
  • mysql_pconnect("localhost","username","password") ?
  • 万能五笔
  • 帐户问题
  • UserName和PassWord的問題
  • “DBX Error: Invalid Username/Password”(Delphi)
  • ORA-01017: invalid username/password; logon denied
  • unix帐户获取
  • qq万能密码软件
  • 关于万能变量!!!!

关键词

  • 加密
  • 密码
  • 用户
  • 屏蔽
  • 字符
  • 验证
  • username
  • 判断
  • 单引号
  • password

得分解答快速导航

  • 帖主:for123

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo